2015-11-13 88 views
0

我在MSDN读到的当静态字段初始化发生?

using System; 
class Test 
{ 
    static void Main() 
    { 
     Console.WriteLine("{0} {1}", B.Y, A.X); 
    } 

    public static int F(string s) 
    { 
     Console.WriteLine(s); 
     return 1; 
    } 
} 

class A 
{ 
    public static int X = Test.F("Init A"); 
} 

class B 
{ 
    public static int Y = Test.F("Init B"); 
} 

输出可以是的

Init A 
Init B 
1 1 

Init B 
Init A 
1 1 

,但我想不出为什么X的excecution的顺序初始值设定项和Y的初始值设定项可以按任何顺序发生?

我总是得到第二个结果(我期望)在我的系统上,但看不到第一个结果也能实现?

谢谢。

+0

另一个不好的微软例子。它总是第二,因为声明:B.Y,A.X.如果你有A.X,B.Y.关键是初始化将按照您使用变量的顺序发生,而不是由写入类的方式来控制。 – jdweng

+0

有趣。在writeline之前在F函数中放置一个随机数的线程睡眠并运行应用程序几次以查看它的功能。不幸的是,我刚离开办公室,所以无法自己测试。 –

+0

@jdweng,哦....我明白为什么这是一个误导性的例子。 – user3723486

回答

2

您正在阅读语言规范,该规范告诉您根据语言规范允许发生什么。您正在使用的语言的特定实现中看到一致的行为,并且该行为与规范一致,因此一切都很好。

语言规范警告你,你不应该依赖于你的程序中的行为,因为在未来版本的运行时(或在不同的处理器/平台/星期几),行为可能会改变。