什么时候静态构造函数在静态字段之前或之后执行?

时间:2013-08-07 22:10:28

标签: c# .net static static-constructor

考虑一下

public class ClassA
{
     public string PropertyB { get; set; }
}

然后我像这样使用它

public class ClassD
{
     static readonly ClassA PropertyE = new ClassA();

     static ClassD()
     {
          PropertyE.PropertyB = "valueF";
     }
}

但其余的代码没有像我预期的那样工作。然后我重写了ClassD,它起作用了

public class ClassD
{
     static readonly ClassA PropertyE = new ClassA { PropertyB = "valueF" };
}

这两个代码示例以哪种方式不同?我希望他们有相同的行为,但他们没有。

1 个答案:

答案 0 :(得分:1)

根据MSDN

  

如果一个类包含任何带有初始值设定项的静态字段,那么这些初始值设定项会在执行静态构造函数之前立即以文本顺序执行

两个类之间的唯一区别是PropertyE的初始化方式。在第一个示例中,首先分配ClassD.PropertyE,然后分配ClassA.PropertyB。在第二个示例中,首先分配ClassA.PropertyB,然后分配ClassD.PropertyE可以产生稍微不同的结果。

您可能还会遇到字段间循环依赖性问题。正如MSDN文章所述:

  

可以构造循环依赖关系,允许在默认值状态下观察带有变量初始值设定项的静态字段。

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

产生输出

     
    

X = 1,Y = 2