Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态构造函数何时执行,在静态字段之前还是之后?_C#_.net_Static_Static Constructor - Fatal编程技术网

C# 静态构造函数何时执行,在静态字段之前还是之后?

C# 静态构造函数何时执行,在静态字段之前还是之后?,c#,.net,static,static-constructor,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"; } } 但是代码的其余部分没有

我想我有

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" };
}
这两个代码示例在哪方面不同?我原以为他们有同样的行为,但他们没有。

根据:

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

这两个类之间的唯一区别是
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


如果是这种情况,这两个代码示例将具有相同的行为,不是吗?@JaderDias你能解释一下它们的行为如何不同吗?行为与静态构造函数完全没有执行时的行为相同。@JaderDias我尝试了一个示例应用程序,使用你的代码进行了轻微修改(
this.
在静态构造函数中无效,
PropertyE
公开,
valueF
替换为字符串常量
“valueF”
。我得到的正是您所期望的:
Console.WriteLine(ClassD.PropertyE.PropertyB);//valueF
@JaderDias在初始化顺序上不起作用。在第一个示例之后,什么东西不起作用?可能这里找不到原因,而是您留下的东西的结果(根据@p.s.w.g的评论)@AustinSalonen纠正了您需要扩展的问题,但是代码的其余部分没有像我预期的那样工作,并强调了您预期的内容(我预期它们具有相同的行为,但它们没有)。