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

C# 使用空静态构造函数的单例实现,c#,singleton,C#,Singleton,我正在经历下面提到的单例实现。我理解静态构造函数在第一次静态方法调用之前或在实例化te对象之前被执行,但不理解它在这里的用法(甚至从注释中)。有人能帮我理解吗 public sealed class Singleton { private static readonly Singleton instance = new Singleton(); // Explicit static constructor to tell C# compiler // not to ma

我正在经历下面提到的单例实现。我理解静态构造函数在第一次静态方法调用之前或在实例化te对象之前被执行,但不理解它在这里的用法(甚至从注释中)。有人能帮我理解吗

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;
        }
    }
}

静态构造函数不存在,以便在其他任何操作之前或之后调用它,只是为了使编译器不设置
beforefieldinit
标志

有关这方面的更多信息,请点击此处:

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

另一方面,如果未设置
beforefieldinit
(因为定义了静态构造函数——即使是空构造函数),那么执行相同的方法只会导致在满足条件并且实际进行调用时初始化singleton实例


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

下面的要点对此进行了解释,具体地说:
只有当类型没有使用名为“beforefieldinit”的特殊标志进行标记时,.NET才能保证类型初始值设定项的惰性。不幸的是,C#编译器(至少在.NET 1.1运行时中提供)将所有没有静态构造函数的类型(即看起来像构造函数但被标记为静态的块)标记为“beforefieldinit”。
因此,他希望
新的Singleton()
尽可能晚(延迟地)构造,让C#编译器做到这一点的唯一方法是提供一个空的静态构造函数。请原谅我的无知。什么是“类型初始值设定项的惰性”。这是第一次请求时的初始化?完全正确。只有在这种情况下才有保证,否则运行时可以随时运行类型初始值设定项,比如在加载类型之后。更多解释请参见Jay答案中的链接。
public void Foo()
{
    if (false)
    {
        var bar = Singleton.Instance.SomeMethod();
    }
}