C# 静态变量初始化顺序

C# 静态变量初始化顺序,c#,C#,我已将断点放在“get”中 发现s_定律为空 怎么可能呢?我认为静态变量是在第一类访问之前初始化的,并且是按行顺序初始化的。这只是一个猜测,但是来自: 如果类中存在静态构造函数(第10.11节),则执行 在执行之前立即执行静态字段初始值设定项 静态构造函数否则,静态字段初始值设定项为 在第一次使用之前的依赖于实现的时间执行 该类的静态字段 如果在属性getter上中断,则静态备份字段尚未被访问,因此可能已初始化,也可能尚未初始化。这只是猜测,但来自: 如果类中存在静态构造函数(第10.11节),

我已将断点放在“get”中

发现s_定律为空


怎么可能呢?我认为静态变量是在第一类访问之前初始化的,并且是按行顺序初始化的。

这只是一个猜测,但是来自:

如果类中存在静态构造函数(第10.11节),则执行 在执行之前立即执行静态字段初始值设定项 静态构造函数否则,静态字段初始值设定项为 在第一次使用之前的依赖于实现的时间执行 该类的静态字段


如果在属性getter上中断,则静态备份字段尚未被访问,因此可能已初始化,也可能尚未初始化。

这只是猜测,但来自:

如果类中存在静态构造函数(第10.11节),则执行 在执行之前立即执行静态字段初始值设定项 静态构造函数否则,静态字段初始值设定项为 在第一次使用之前的依赖于实现的时间执行 该类的静态字段


如果在属性getter上中断,则静态备份字段尚未被访问,因此可能已初始化,也可能尚未初始化。

谢谢大家的帮助!我查看了堆栈跟踪,发现在静态变量初始化顺序中有一些疯狂的递归。所以我简化了代码,现在它可以工作了。

谢谢大家的帮助!我查看了堆栈跟踪,发现在静态变量初始化顺序中有一些疯狂的递归。所以我简化了代码,现在它可以工作了。

不太可能是实际的答案,但可能有一个静态构造函数将其设置回null(即开发人员只是故意的)。另外,将来能否请您将代码片段作为文本而不是文本图片提供?为什么不在getter中检查
s_Law
,并将其设置为一个新实例(如果为null)?@mgnoonan好的,它是
readonly
,因此如果尝试,您无法设置它。除此之外;关键是它永远不应该为null,因为它被初始化为一个值,以后不能更改。LawClass构造函数中是否抛出错误?无法复制。我唯一能想到的是readonly字段上方有一个unshown[ThreadStatic]属性,实例是从一个线程创建的,get是从另一个线程调用的。静态初始化只执行一次。不太可能是实际的答案,但可能有一个静态构造函数将其设置回null(即,开发人员只是故意的)。另外,将来能否请您将代码片段作为文本而不是文本图片提供?为什么不在getter中检查
s_Law
,并将其设置为一个新实例(如果为null)?@mgnoonan好的,它是
readonly
,因此如果尝试,您无法设置它。除此之外;关键是它永远不应该为null,因为它被初始化为一个值,以后不能更改。LawClass构造函数中是否抛出错误?无法复制。我唯一能想到的是readonly字段上方有一个unshown[ThreadStatic]属性,实例是从一个线程创建的,get是从另一个线程调用的。静态初始化只执行一次。如果您当前已中断,则还不需要需要需要s_定律定义值的代码行。在下一行中,将需要一个值,我希望初始化将在那时发生。静态不需要是惰性的,但在Microsoft CLR中它们通常是惰性的。在您当前中断的地方,还不需要需要需要定义s_定律值的代码行。在下一行中,将需要一个值,我希望初始化将在那时发生。静态不需要是惰性的,但在MicrosoftCLR中通常是惰性的。
static readonly LawClass s_Law = new LawClass();
public static LawClass Law { get { return s_Law; } }