C# 此代码实现的静态初始化顺序是否特定?
我有一个很大程度上依赖于静态初始化的设计。我注意到,在一系列操作系统更新之后,我的设计在一些较旧版本的.NET Framework上似乎失败了(v您的代码依赖于在分配给C# 此代码实现的静态初始化顺序是否特定?,c#,C#,我有一个很大程度上依赖于静态初始化的设计。我注意到,在一系列操作系统更新之后,我的设计在一些较旧版本的.NET Framework上似乎失败了(v您的代码依赖于在分配给Foo.A之后调用Bar的静态构造函数。语言规范并不保证这一点。它只在您实际编写静态构造函数时提供保证,而不是在编译器隐式生成静态构造函数时提供保证:在这种情况下,可能会比您预期的更早调用它 要确保您的代码在所有有效的.NET Framework实现中的行为方式相同,请添加一个静态构造函数。您不需要重新考虑初始值设定项,它们可以保
Foo.A
之后调用Bar
的静态构造函数。语言规范并不保证这一点。它只在您实际编写静态构造函数时提供保证,而不是在编译器隐式生成静态构造函数时提供保证:在这种情况下,可能会比您预期的更早调用它
要确保您的代码在所有有效的.NET Framework实现中的行为方式相同,请添加一个静态构造函数。您不需要重新考虑初始值设定项,它们可以保留在原来的位置
public class Bar : Foo {
static Bar() { } // <-- add this
public static object B = InitB();
private static object InitB() { return A };
}
公共类栏:Foo{
静态条(){}//
上述代码实现的行为是否特定
对于上面的例子,作者认为情况就是这样
如果类中存在静态构造函数,则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项将在第一次使用该类的静态字段之前的依赖于实现的时间执行
为了在.NET版本之间保持一致性,并强制执行初始化顺序,您应该在这两个类中添加一个静态构造函数。类a在哪里,为什么要使这个类如此复杂?简短回答:是的,实现细节随着.NET新版本的更改而更改。Jon Skeet对这些差异有一个简单的解释。@TMcKeown:您为什么期望一个类A
?只有一个名为A
的静态属性,我现在明白了。不过,我的主要观点是为什么默认值过于复杂。
public class Bar : Foo {
static Bar() { } // <-- add this
public static object B = InitB();
private static object InitB() { return A };
}