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

时间:2012-03-16 03:16:16

标签: c# singleton

我正在阅读下面提到的here的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;
        }
    }
}

1 个答案:

答案 0 :(得分:7)

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

有关此内容的更多信息,请访问:What does beforefieldinit flag do?

基本原理是在单例对象的初始化中实现懒惰度量。如果设置了beforefieldinit(因为没有定义静态构造函数),那么执行一个有条件地引用Singleton.Instance的方法可能会初始化单例对象,即使条件不满足并且该调用从来没有。

public void Foo()
{
    if (false)
    {
        var bar = Singleton.Instance.SomeMethod();
    }
}

另一方面,如果未设置beforefieldinit(因为定义了静态构造函数 - 即使是空构造函数),那么执行相同的方法只会导致单例实例初始化,如果条件是满意,并且该电话实际

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