gpt4 book ai didi

c# - 当类具有静态构造函数时,稍后初始化静态字段

转载 作者:行者123 更新时间:2023-11-30 14:51:42 24 4
gpt4 key购买 nike

通过运行这个简单的代码:

class Program
{
class MyClassWithStatic
{
public static int Number = SomeService.GetData();

static MyClassWithStatic()
{
Console.WriteLine("static ctor runs");
}
}

class SomeService
{
public static int GetData()
{
Console.WriteLine("GetDataRuns");
return 42;
}
}

static void Main(string[] args)
{
InitService();

var value = MyClassWithStatic.Number;
Console.WriteLine(value);
}

private static void InitService()
{
Console.WriteLine("InitServiceRuns");
}
}

我机器上的输出是这样的:

InitServiceRuns
GetDataRuns
static ctor runs
42

意味着首先调用 InitService 方法,然后初始化 MyClassWithStatic 的静态字段,然后调用静态构造函数(实际上通过查看 ILSpy 和 IlDasm 中的这个我们可以看到静态字段的初始化发生在cctor的开头)

此时没有什么有趣的,一切都有意义,但是当我删除 MyClassWithStatic 的静态构造函数时(所以 MyClassWithStatic 变成了这个,其他一切都像以前一样)

class MyClassWithStatic
{
public static int Number = SomeService.GetData();
}

输出是这样的:

GetDataRuns
InitServiceRuns
42

这意味着通过删除静态构造函数,可以更早地初始化静态字段。由于初始化是静态构造函数的一部分(我通过使用 ildasm 查看它来说明这一点),因此效果基本上是静态构造函数被更早地调用。

问题来了:

  1. 有人可以解释这种行为吗?这可能是什么原因?

  2. 调用静态构造函数时,是否还有其他可以更改的内容?(例如附加分析器或在 IIS 中运行它等)(我比较了调试、 Release模式、x86、x64 并且都显示相同的行为)

一些通用的东西:

- 这是在 .NET 4.6 控制台应用程序中。我也切换到 .NET 2(应该使用不同的 clr 运行,并且行为相同,没有任何区别)

-我也在 .NET 核心中尝试了这个:无论有没有 cctor,InitService 方法都会首先被调用。

-现在我完全知道 this page :

The user has no control on when the static constructor is executed in the program.

而且我也知道在静态构造函数中有很多事情是不应该做的。但不幸的是,我必须处理一个代码,其中这部分不在我的控制范围内,而且我描述的差异会产生巨大的差异。 (而且我还经历了许多 C# cctor 相关的 SO 问题..)

(还有第 3 个问题:)所以我描述的整个事情是不是有点问题?

最佳答案

具有静态构造函数的类不会被标记为 beforefieldinit 标志,这允许运行时在稍后的时间对其进行初始化(换句话说,MyClassWithStatic.Number 将在您首次引用/访问 MyClassWithStatic 时初始化)

this article 抢劫获取更多信息。

关于c# - 当类具有静态构造函数时,稍后初始化静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33709210/

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