强制在c#构造函数中显式初始化成员

时间:2009-02-11 22:14:49

标签: c# constructor

如果每个构造函数都没有初始化给定的成员,有没有办法导致错误?也许是const的东西?

我想要这个,因为我有一堆代码,因为错误计算成员值而导致错误。我真正想要做的是删除整个混乱,并在重做时遵循编译器的主导(编写使用最终结果的代码,修复使用不存在的代码的错误,修复错误等)。这不起作用的一步是成员变量,因为我没有被迫在构造函数中初始化它们,就像我对局部变量一样。

5 个答案:

答案 0 :(得分:3)

不幸的是,C#没有提供这样的内置谓词。您可以做的最好的事情是编写一个方法来检查有问题的对象是否为null或一些预先确定的标志值,并在每个构造函数的末尾和/或每个引用该对象的方法的顶部进行调用。

答案 1 :(得分:1)

支持。例如:

  class Test {
    int notAssigned;
    void method() {
      // Use it, but don't initialize it
      int ix = notAssigned;
    }
  }

产地:

警告CS0649:字段'ConsoleApplication1.Test.notAssigned'永远不会分配给,并且始终具有默认值0

要将其变为错误,请使用“项目+属性”,“构建”选项卡,将警告视为错误。

答案 2 :(得分:1)

我认为没有办法让编译器抱怨未初始化的成员,前提是该成员至少在一个案例中初始化。但是,如果所有值都有明确的默认值,则可以使用默认构造函数来确保所有成员都初始化为其默认值,并从所有重载的构造函数继承默认构造函数。

public class Foo
{
   private int val1;
   private List<int> list;

   public Foo()
   {
      //could also be a private constructor if that's appropriate
      //all default initialization
      val1 = 1;
      list = new List<int>();
   }

   public Foo(int nonDefaultValue1) : this()
   {
      //set inputted value
      val1 = nonDefaultValue1;
      //no need to initialize list, done by default constructor
   }
}

答案 3 :(得分:1)

听起来像StyleCop可以帮助你当然必须建立你的自定义规则

答案 4 :(得分:0)

提示:在Visual Studio中,学习使用Shift + F12(查找所有引用)。非常方便找到那些改变状态的引用。