如果您有以下内容:
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之前初始化(除了重构或重新排序代码)?我意识到订单确定每个项目何时执行,但订单确定看起来很脆弱。
我提前为简单的代码道歉。
答案 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)
字段初始化程序以代码顺序显式执行 - 即自上而下。请注意,如果在单独的文件中使用部分类,则仍未定义。
但是:如果顺序很重要,那么你应该将代码移动到构造函数中(在这种情况下是一个静态构造函数)。重新排序相互依赖的字段初始化程序只是在维护期间遇到麻烦。