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纠正了您需要扩展的问题,但是代码的其余部分没有像我预期的那样工作,并强调了您预期的内容(我预期它们具有相同的行为,但它们没有)。