C# 静态字段初始化何时发生?
我在上面读到了C# 静态字段初始化何时发生?,c#,static,initialization,field,C#,Static,Initialization,Field,我在上面读到了 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("I
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
或
但是我不明白为什么X的初始值设定项和Y的初始值设定项的执行顺序可以是任意一个顺序
我总是在我的系统上得到第二个结果(这是我期望的),但看不到第一个结果是如何实现的
谢谢。您正在阅读语言规范,它告诉您根据语言规范允许发生什么。您正在使用的语言的特定实现中看到了一致的行为,并且该行为与规范一致,因此一切正常
语言规范警告您的是,您不应该在程序中依赖这种行为,因为在未来版本的运行时(或在不同的处理器/平台/一周中的某一天)中,这种行为可能会改变。另一个糟糕的Microsoft示例。它总是第二个,因为有这样一句话:B.Y,A.X。如果你有A.X,B.Y,第一个将出现。关键是初始化将按照你使用变量的顺序发生,而不是由类的编写方式控制。有趣。在writeline之前在F函数上放置一个随机数的线程sleep,然后运行应用程序几次,看看它能做什么。不幸的是,我刚离开办公室,所以不能亲自测试。@jdweng,噢。。。。???我明白为什么这真的是一个误导性的例子。@Darren Gourley,运行了测试,得到了我预期的结果。它并不是说一个特定的运行时实现将随机产生任何一个输出。这意味着运行时实现者可以按照选择的顺序执行静态字段初始值设定项,从而产生任意一种输出。可能不存在生成第一个输出的实现。
Init B
Init A
1 1