使用空静态构造函数的单例实现

Nem*_*emo 6 c# singleton

我正在阅读这里提到的以下Singleton实现.我理解静态构造函数在第一次静态方法调用之前或实例化对象之前执行,但是在这里不理解它的用法(甚至来自注释).任何人都可以帮我理解吗?

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jay*_*Jay 7

静态构造函数不存在,以便它应该在其他任何东西之前或之后调用,只是作为使编译器设置beforefieldinit标志的方法.

有关这方面的更多信息:beforefieldinit flag有什么作用?

理由是在单例对象的初始化中实现懒惰度量.如果beforefieldinit设置了(因为没有定义静态构造函数),则执行有条件引用的方法Singleton.Instance可能会初始化单例对象,即使条件不满足且从未进行调用.

public void Foo()
{
    if (false)
    {
        var bar = Singleton.Instance.SomeMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果beforefieldinit未设置(因为定义了静态构造函数 - 甚至是空构造函数),那么执行相同的方法只会在满足条件并且实际调用的情况下初始化单例实例.

那篇文章接着指出这个特定的实现并不完全是懒惰的,因为调用你在singleton类上定义的任何其他静态成员也会导致Instance初始化.