【问题标题】:Initialization of static members静态成员的初始化
【发布时间】:2011-05-10 19:27:26
【问题描述】:
class Test
{
   private static int m = 10;
   private static double n = 20;

   public Test()
   {

   }
}

如果使用静态构造函数,则在构造类的第一个实例或引用第一个变量时初始化静态变量。如果我不使用静态构造函数,静态变量什么时候初始化,以什么顺序初始化。

【问题讨论】:

标签: c#


【解决方案1】:

C# 语言规范section 10.4.5.1 说:

如果类中存在静态构造函数,则执行静态字段初始值设定项 在执行之前立即发生 那个静态构造函数。否则, 静态字段初始化器是 在执行 之前的依赖于实现的时间 第一次使用静态字段 那个班级。

因此,它依赖于实现,但所有静态字段都保证在使用其中之一之前被初始化。

【讨论】:

  • 用Reflector看看生成的类,你会看到那里有静态构造函数。
  • @Aliostad,一些编译器可能会这样做,但不是全部,这就是它依赖于实现的原因:)
  • 类的静态字段变量初始化器对应于一系列赋值,它们按照它们在类声明中出现的文本顺序执行。文字顺序是什么意思?
  • 一些编译器可能会这样做”。好吧,我以为我们在谈论 C# 编译器?? :) 我说编译器吐出来...
  • @Raghav55,它表示解析器遇到它们的顺序,即它们在类中声明的顺序。
【解决方案2】:

在 C#4.0 中,静态字段在没有静态构造函数的情况下尽可能惰性地初始化。而在以前的版本中,我们无法给出准确的初始化时间。 Jon Skeet 对此有 a great post

【讨论】:

    【解决方案3】:

    同一个地方。 Compiler 为你输出静态构造函数。顺序是定义的一个成员。


    如果用Reflector查看类,可以看到静态构造函数:

    public class MyStaticClass
    {
        public static int MyInt = 10;
    }
    

    变成:

    public class MyStaticClass
    {
        // Fields
        public static int MyInt;
    
        // Methods
        static MyStaticClass();
        public MyStaticClass();
    }
    

    static MyStaticClass()
    {
        MyInt = 10;
    }
    

    【讨论】:

    • 不完全是。如果没有显式的静态构造函数,行为就不一样了。
    • 这两个private static int m=10 or Test() { m =10}有什么区别吗
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-09-01
    相关资源
    最近更新 更多