0

考虑我有

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" };
}

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

4

1 回答 1

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

于 2013-08-07T22:14:35.770 回答