2012-07-23 196 views
2

我已经把断点为“搞定”静态变量初始化顺序

static readonly LawClass s_Law = new LawClass(); 
public static LawClass Law { get { return s_Law; } } 

,发现s_law为空。

这怎么可能?我认为静态变量在第一类访问之前和逐行顺序被初始化。

+1

不可能是实际的答案,但可能有一个静态构造函数将其设置为空(即开发人员只是表示意思)。另外,将来你能否提供代码片段作为文本,而不是文本的图片? – Servy 2012-07-23 18:19:21

+0

为什么不在getter中检查's_Law'并将它设置为一个新实例(如果它为空)? – mgnoonan 2012-07-23 18:21:01

+0

@mgnoonan嗯,它是'只读',所以如果你尝试过,你就不能设置它。除此之外;重点是它不应该为空,因为它已初始化为一个值,并且以后不能更改。 – Servy 2012-07-23 18:23:33

回答

4

这仅仅是猜测,但从http://msdn.microsoft.com/en-us/library/aa645758(v=vs.71).aspx

如果静态构造(第10.11节)在类存在,静态字段初始化的执行 发生之前立即执行 该静态构造。 否则,静态字段初始值设定项是在首次使用该类的静态字段之前的执行相关时间执行的 。

如果您在属性获取方中断,静态支持字段尚未被访问,因此可能已经或可能未被初始化。

+0

如果您目前有问题,那么需要定义s_Law值的代码行还不需要。在下一行中,将需要一个值,我期望在那个时候进行初始化。静态不需要懒惰,但在他们通常使用的Microsoft CLR中。 – KeithS 2012-07-23 18:41:21

0

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