积极答复者
静态构造方法执行错误(.net 4下用release编译)

问题
-
要重现这个问题的代码很简单:
-
class Program { private static ClassA a = new ClassA(); static void Main(string[] args) { Console.ReadLine(); } } class ClassA { static ClassA() { Console.WriteLine("A cctor"); } }
只要访问ClassA,它的静态构造方法就会执行。
所以程序一运行就应该输出“A cctor”。
实际上如果target framework设为.net 2.0或者3.5的话输出结果都是“A cctor”。
但是如果target framework是.net 4而且用release编译的话,编译出的程序集脱离IDE运行(在VS里运行结果还是对的)时则没有输出任何东西。
太奇怪了,哪位知道怎么回事请帮忙,谢谢。 -
答案
-
release 的时候会延迟加载 这是一种优化的执行方式 如果一个类型除了new以外 没有任何人防问它 他就会被延迟到第一次有人访问的时候加载
你可以尝试下
class Program { private static ClassA a = new ClassA(); static void Main(string[] args) { ClassA.AValue=10; Console.ReadLine(); } } class ClassA { static ClassA() { Console.WriteLine("A cctor"); } static int AValue{get;set;} }
成为 Microsoft V Dash了。。。 欢迎各位前辈同事在OCS加我- 已标记为答案 cuipengfei 2010年7月31日 8:15
全部回复
-
release 的时候会延迟加载 这是一种优化的执行方式 如果一个类型除了new以外 没有任何人防问它 他就会被延迟到第一次有人访问的时候加载
你可以尝试下
class Program { private static ClassA a = new ClassA(); static void Main(string[] args) { ClassA.AValue=10; Console.ReadLine(); } } class ClassA { static ClassA() { Console.WriteLine("A cctor"); } static int AValue{get;set;} }
成为 Microsoft V Dash了。。。 欢迎各位前辈同事在OCS加我- 已标记为答案 cuipengfei 2010年7月31日 8:15
-
一个类型在被访问前不应当加载 这个是设计的原意
如果你不希望某个声明被编译器和jit优化 请声明 为volatile 这个也是在兼容多版本开发中多次建议的
成为 Microsoft V Dash了。。。 欢迎各位前辈同事在OCS加我- 已建议为答案 韦恩卑鄙 waywa 2010年7月31日 5:13