Pre Fieldinit旗帜是做什么的? 当我看着我的班级的IL时,我看到了这面旗帜,但我不知道这面旗帜实际上在做什么?

推荐答案

在这个问题上见my article.

基本上,beforefieldinit意味着"在引用任何静态字段之前,可以在任何点初始化类型."In theory这意味着它可以被初始化——如果你调用一个不涉及任何字段的静态方法,JIT不需要初始化类型.

In practice这意味着该类比其他方法初始化earlier——在might使用它的第一个方法开始时初始化它是可以的.将其与don't已应用beforefieldinit的类型进行比较,其中类型初始化必须在第一次使用之前立即发生.

那么,假设我们有:

public static void DoSomething(bool which)
{
    if (which)
    {
        FirstType.Foo();
    }
    else
    {
        SecondType.Bar();
    }
}

如果两个类型都应用了beforefieldinit值(在C#中,除非该类型有静电构造函数,否则默认情况下是这样),那么它们将在DoSomething方法的开始处被初始化为both值(通常-这是不能保证的).如果它们没有beforefieldinit个,那么根据标志只会初始化其中的one个.

这就是为什么经常使用静态构造函数(甚至是空构造函数!)implementing the singleton pattern岁的时候.

.net相关问答推荐

EF核心类似功能T-SQL UPDATE FROM

如何查询 DOTNET_CLI_TELEMETRY_OPTOUT 是否永久设置为 TRUE?

仅使用 .NET GetBytes 方法转换有效字节而不创建问号

.NET 4.5 项目未在 Visual Studio 2022 中编译

仅在有换行符时捕获分隔符之间的所有文本

判断内部异常的最佳方法?

查找所有源硬编码字符串

什么是提升运算符?

CurrentCulture、InvariantCulture、CurrentUICulture 和 InstalledUICulture 之间的区别

使用 Thread.Abort() 有什么问题

哪个单元测试框架?

ASP.NET Core 等效于 ASP.NET MVC 5 的 HttpException

覆盖方法上的 C# 可选参数

如何将时间设置为当天的午夜?

SQLParameter 如何防止 SQL 注入?

多个添加的实体可能具有相同的主键

为什么 !0 是 Microsoft 中间语言 (MSIL) 中的一种类型?

名称 <...> 不存在于命名空间 clr-namespace <...>

判断数据表中是否包含空值的最佳方法

枚举和匹配属性的 C# 命名约定