gpt4 book ai didi

c# - 调试和发布版本中的静态字段初始化

转载 作者:可可西里 更新时间:2023-11-01 08:27:04 24 4
gpt4 key购买 nike

我发现静态字段初始化的行为可能不同。对于以下代码,

public class Class1
{
public static void Main()
{
Console.WriteLine("Main");
Test();
Console.ReadLine();
}

public static void Test(){
Console.WriteLine("Test");
Singleton.Instance.DoSomething();
}
}

public class Singleton
{
private static Singleton sInstance = new Singleton();

protected Singleton()
{
Console.WriteLine("Singleton Constructor");
}

public static Singleton Instance
{
get
{
return sInstance;
}
}

public void DoSomething(){}
}

在调试版本中,它会打印

Main
Test
Singleton Constructor

在发布版本中,它会打印

Main
Singleton Constructor
Test

我检查了这两个版本生成的 IL 代码,几乎相同。

请问这是怎么回事?如果它是发布构建中的一种 JIT 优化,那么动机是什么?

最佳答案

静态初始化程序何时执行完全取决于实现。所以顺序可能不同。但是如果你提供一个静态构造函数,那些静态初始化器总是会更早执行。因此,输出将以一致的顺序进行。

来自 MSDN

The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration. If a static constructor (Section 10.11) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.

添加 static constructorSingleton 类中

static Singleton() { }

关于c# - 调试和发布版本中的静态字段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10775219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com