是否应在调用构造函数之前完成静态字段初始化?
以下程序提供的输出似乎对我不正确.
new A() _A == null static A() new A() _A == A
代码:
public class A { public static string _A = (new A()).I(); public A() { Console.WriteLine("new A()"); if (_A == null) Console.WriteLine("_A == null"); else Console.WriteLine("_A == " + _A); } static A() { Console.WriteLine("static A()"); } public string I() { return "A"; } } class Program { static void Main(string[] args) { var a = new A(); } }
Reed Copsey.. 28
这是对的.
你的静态初始化器,然后静态构造函数在你的标准构造函数之前运行,但是当它运行时,它使用新的A(),所以通过你的非静态构造函数路径.这会导致您看到的消息.
这是完整的执行路径:
当您第一次调用var a = new A();
程序时,这是第一次访问A.
这将触发静态初始化 A._A
此时,A._A构造着 _A = (new A()).I();
这点击
Console.WriteLine("new A()"); if (_A == null) Console.WriteLine("_A == null");
从那时起,_A尚未使用返回的构造类型(尚未)进行设置.
接下来,A { static A(); }
运行静态构造函数.这将打印"静态A()"消息.
最后,var a = new A();
执行原始语句(),但此时构造静态,以便获得最终打印.
这是对的.
你的静态初始化器,然后静态构造函数在你的标准构造函数之前运行,但是当它运行时,它使用新的A(),所以通过你的非静态构造函数路径.这会导致您看到的消息.
这是完整的执行路径:
当您第一次调用var a = new A();
程序时,这是第一次访问A.
这将触发静态初始化 A._A
此时,A._A构造着 _A = (new A()).I();
这点击
Console.WriteLine("new A()"); if (_A == null) Console.WriteLine("_A == null");
从那时起,_A尚未使用返回的构造类型(尚未)进行设置.
接下来,A { static A(); }
运行静态构造函数.这将打印"静态A()"消息.
最后,var a = new A();
执行原始语句(),但此时构造静态,以便获得最终打印.