C# 类的静态成员是否在调用静态构造函数之前就已初始化?

C# 类的静态成员是否在调用静态构造函数之前就已初始化?,c#,.net,static,static-initialization,class-fields,C#,.net,Static,Static Initialization,Class Fields,我在看书,似乎有矛盾 静态成员在访问静态成员之前初始化 第一次在静态构造函数之前,如果有, 被称为 也在下一段左右, 如果类包含静态字段,请提供静态构造函数 在类加载时初始化它们 如果静态构造函数的目的是初始化类的静态成员,那么为什么它说静态成员在调用静态构造函数之前就已经初始化了呢 如果我写下: public static int age = 10; static SimpleClass() { age = 20; } 这是否意味着年龄首先被初始化为10,然后值被覆盖为20?第二个引号

我在看书,似乎有矛盾

静态成员在访问静态成员之前初始化 第一次在静态构造函数之前,如果有, 被称为

也在下一段左右,

如果类包含静态字段,请提供静态构造函数 在类加载时初始化它们

如果静态构造函数的目的是初始化类的静态成员,那么为什么它说静态成员在调用静态构造函数之前就已经初始化了呢

如果我写下:

public  static int age = 10;

static SimpleClass()
{
 age = 20;
}

这是否意味着年龄首先被初始化为10,然后值被覆盖为20?

第二个引号是一个建议:Microsoft建议在声明时使用静态构造函数而不是初始化字段,以避免排序问题,特别是在使用分部类时,这可能会导致空异常

事实上,通过使用分部类,字段的赋值顺序不能得到保证。使用静态构造器,它可以

如果getter不访问未初始化引用类型的实例,还可以使用属性确保不会得到null异常

因此,由于第一个引号,您的问题的答案是:是的,这意味着年龄首先被初始化为10,然后值被覆盖为20,除非您使用的是分部类,否则结果可能是危险的,这可能是与调试器的斗争


您可以通过使用断点来检查和验证这一点。

谢谢……如果字段初始值设定项引用了另一个字段,那么关于
partial
类的注释是否不仅相关?比如,如果我有(在类的同一个“部分”)
static int a=10+b;静态积分b=10+a
,则这两个初始化保证以“文本”顺序运行,因此因为我首先声明了
a
,它的初始值设定项首先运行,并且在初始化之前会看到
b
,所以
a
变成
10+0
,所以
10
;而
b
变为
10+10
,因此
20
。如果您将
a
b
放在
partial
类的不同“部分”的不同文件中,您可能会首先使用“错误”部分,因此
a
20
<代码>b
10