2

如果您有以下情况:

 public class MyClass {
      private static readonly MyObject obj = 
              new MyObject { parent = listObject[0] };
      private static readonly List<MyObject> listObject = 
              new List<MyObject> { new MyObject() };
 }

初始化 MyClass 时会抛出运行时错误,因为当它尝试初始化 obj 时,listObject 为空。

编辑:有没有办法明确指定每个只读对象何时初始化(如通过属性),以便 listObject 在 obj 之前初始化(重构或重新排序代码除外)?我意识到订单决定了每个项目何时执行,但是让订单确定似乎很脆弱。

我提前为简单的代码道歉。

4

4 回答 4

4
public class MyClass {
    private static readonly MyObject obj;
    private static readonly List<MyObject> listObject;

    static MyClass()
    {
        listObject = new List<MyObject> { new MyObject() };
        obj = new MyObject { parent = listObject[0] };
    }
}

如果将初始化带入构造函数,则可以重新安排字段的初始化顺序。

成员变量和静态变量的初始化保证按照它们在文件中出现的顺序进行。因此,您可以通过首先初始化列表来避免编译时错误:

static readonly List<MyObject> listObject = new List<MyObject> { new MyObject() };
static readonly MyObject obj = new MyObject { parent = listObject[0] };

我仍然会选择在构造函数中初始化你的字段。依赖于按照声明顺序初始化的字段是非常脆弱的。如果有人改变字段的顺序来满足他们的审美需求怎么办?繁荣。

于 2013-07-01T17:45:28.917 回答
2

你需要一个静态构造函数!!

public class MyClass {
    private static readonly MyObject obj;
    private static readonly List<MyObject> listObject;

    static MyClass()
    {
        listObject = new List<MyObject> { new MyObject() };
        obj = new MyObject { parent = listObject[0] };
    }
}

“在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。”

于 2013-07-01T17:47:42.293 回答
1

静态字段的顺序很重要。它们是从上到下初始化的,您可以重新排列它们以解决您的问题。

 public class MyClass { 
     private static readonly List<MyObject> listObject = 
              new List<MyObject> { new MyObject() };
     private static readonly MyObject obj = 
              new MyObject { parent = listObject[0] };
 }

但这可能会引入意想不到的问题,例如当代码格式化程序按字母顺序对字段定义进行排序时。

于 2013-07-01T17:47:20.737 回答
1

字段初始值设定项按代码顺序显式执行 - 即自上而下。请注意,如果在单独的文件中使用部分类,这仍然是未定义的。

但是:如果顺序很重要,那么您应该将代码移动到构造函数中(在这种情况下是静态构造函数)。重新排序相互依赖的字段初始值设定项只是在维护期间自找麻烦。

于 2013-07-01T17:48:33.703 回答