更改评估私有只读属性的顺序

时间:2013-07-01 17:44:04

标签: c# c#-4.0

如果您有以下内容:

 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为null。

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

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

4 个答案:

答案 0 :(得分: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] };

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

答案 1 :(得分:2)

您需要static constructor !!

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] };
    }
}

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

答案 2 :(得分: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] };
 }

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

答案 3 :(得分:1)

字段初始化程序以代码顺序显式执行 - 即自上而下。请注意,如果在单独的文件中使用部分类,则仍未定义。

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