【问题标题】:When static field initialization happens? [duplicate]什么时候发生静态字段初始化? [复制]
【发布时间】:2015-11-13 17:01:45
【问题描述】:

我在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 的初始化程序和 Y 的初始化程序的执行顺序可以按任何顺序发生?

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

谢谢。

【问题讨论】:

  • 这并不是说特定的运行时实现会随机产生任一输出。它是说运行时实现者可以按照他们选择的顺序执行静态字段初始化器,从而产生任一输出。可能不存在产生第一个输出的实现。

标签: c# static initialization field


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 2012-03-10
    • 2012-02-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多