基于Jon Skeet的Singleton的更简单的Singleton

我需要一个单例代码。 我读了Jon Skeet关于Singletons的一页,并根据他的建议选择了这个模型(#4):

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

然后我通过几个步骤来修改这个以适应我的情况:

第一步:我不需要一个懒惰的实现,所以我拿出了静态构造函数(正如Jon在他的文章结尾处所建议的那样):

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

    private Singleton(){}

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

第2步:然后用我正在使用的Logging类交换出“instance” Singleton类:

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

    private Singleton(){}

    public static Logging Instance
    {
        get
        {
            return instance;
        }
    }
}

第3步: resharper然后告诉我,我应该为我的“实例”属性使用自动属性:

public sealed class Singleton
{
    private Singleton(){}

    public static Logging Instance { get; } = new Logging();
}

第4步: resharper然后告诉我,我应该将其切换到静态类:

public static class Singleton
{
    public static Logging Instance { get; } = new Logging();
}

我留下的东西与原来的很不一样。 我知道在设置一个线程安全的Singleton时很容易出错。

所以我想问: 我的任何步骤是否使我的课程不再是一个好的Singleton实现?


我的任何步骤是否使我的课不再是一个很好的Singleton实现?

是的,他们这样做。

无论如何,您在步骤#1中删除的行为都是实现细节。 删除空的静态构造函数是好的; 如果你想强制懒惰的init, Lazy<T>无论如何是一个更好的方法,即使它有更多的开销。

在第二步,你的对象根本就不再是一个单身人士,因为你不再控制对象( Logging )的创建次数。

我会说,根本不是一个单身人士,因为“不是一个好的Singleton实现”。

链接地址: http://www.djcxy.com/p/51105.html

上一篇: Simpler Singleton Based on Jon Skeet's Singleton

下一篇: Singleton implementation laziness with static constructor