当前位置:  开发笔记 > 编程语言 > 正文

beforefieldinit旗帜做什么?

如何解决《beforefieldinit旗帜做什么?》经验,为你挑选了2个好方法。

beforefieldinit旗帜做什么?当我查看我班级的IL时,我看到了这个标志,但我不知道这个标志实际上在做什么?



1> Jon Skeet..:

在这个问题上看到我的文章.

基本上,beforefieldinit意味着"可以在引用任何静态字段之前的任何点初始化类型".理论上,这意味着它可以非常懒惰地初始化 - 如果你调用一个不接触任何字段的静态方法,JIT不需要初始化类型.

在实践中,它意味着类比其他方式更早地初始化- 可以在第一个可能使用它的方法的开头初始化它.有哪些类型比较这已经beforefieldinit应用到它们,其中类型初始化到第一前刚刚发生的实际使用.

所以,假设我们有:

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

如果这两种类型都beforefieldinit适用于它们(在C#中默认情况下它们除非类型具有静态构造函数),那么它们将在DoSomething方法开始时初始化(通常 - 不保证).如果他们没有,beforefieldinit那么根据旗帜只会初始化其中一个.

这就是为什么在实现单例模式时使用静态构造函数(甚至是空构造函数!)的常见原因.


我发现使用静态构造函数(即没有beforefieldinit标志的类)会有性能损失.如果经常调用某个类的静态成员,似乎运行时必须在每次调用之前进行额外的检查,以测试该类型是否已经初始化; beforefieldinit避免了这些检查.使用beforefieldinit时,几个基准测试的速度提高了约50%:http://www.codeproject.com/Articles/87991/Dynamic-interfaces-in-any-NET-language

2> OmariO..:

看起来它将在4.6中更改

https://github.com/dotnet/coreclr/issues/1193

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有