C# 如何强制编译器检查是否设置了特定属性

C# 如何强制编译器检查是否设置了特定属性,c#,.net,C#,.net,在下面的类中,我想强制编译器检查PropC是否已设置,如果未设置,则在编译模式下显示错误 public class ClassA { public object PropA { get; set; } public object PropB { get; set; } public object PropC { get; set; } } 我知道我可以使用来创建自定义属性,但我想使用.NET内置类。我认为这类似于检查您的程序,但我认为您需要范围更广的版

在下面的类中,我想强制编译器检查
PropC
是否已设置,如果未设置,则在编译模式下显示错误

public class ClassA 
{
    public object PropA { get; set; }
    public object PropB { get; set; }
    public object PropC { get; set; }        
}

我知道我可以使用来创建自定义属性,但我想使用.NET内置类。

我认为这类似于检查您的程序,但我认为您需要范围更广的版本:“如果创建了我的对象,请确保在对象离开创建它的函数之前设置属性”。这在理论上是可能的,但C#编译器并没有提供一种实现方法。我相信在编译时根本不可能进行更广泛的检查“在使用之前是否分配了属性”

重构可能是更好的方法——如果您不允许创建无效对象,那么证明程序中不存在这样的对象就容易多了。即,可能有一种选择:

public class ClassA 
{
   public object PropC { get; private set; }        
   private ClassA (){};
   public Create (object propC)
   {
      return new ClassA{ PropC = propC };
   }
 }

您所要求的仅在运行时可用,而不是在编译时。您应该使用单元测试来检查是否正在设置属性。

这不是.NET framework的默认功能

但是,您可以使用

您可以将设置配置为在类上运行,以确保满足可验证的不变量。作为回退,您将获得这些契约的运行时安全性,因为使用无效返回值访问属性将导致运行时错误或调试断言。这是通过代码契约包在编译期间重写代码并插入额外代码来验证契约来实现的


请注意,这些行为都取决于您配置的设置。该软件包太复杂,无法在stackoverflow答案中解释,但您可以在以下位置阅读手册/文档

PropC
直到运行时才设置。不能抛出这样的编译时错误。你到底想要什么?Peyman,请检查我的标题编辑是否与你要查找的内容一致。我想确保所有启动ClassA的类都必须设置PropPerHaps。你想要的是隐藏默认构造函数,而是使用一个构造函数,它需要为
PropC
@Kendall-Frey传递一个值:由于某些原因,我不能使用带参数的构造函数,这就是查找属性的原因