Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于Jon Skeet和#x27;s单身汉_C#_.net_Singleton - Fatal编程技术网

C# 基于Jon Skeet和#x27;s单身汉

C# 基于Jon Skeet和#x27;s单身汉,c#,.net,singleton,C#,.net,Singleton,我的代码中需要一个单例。我阅读了Jon Skeet的《单身汉》,并根据他的建议选择了这个模型(#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

我的代码中需要一个单例。我阅读了Jon Skeet的《单身汉》,并根据他的建议选择了这个模型(#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;
        }
    }
}
然后,我通过几个步骤修改它以适应我的场景:

第1步:我不需要惰性实现,所以我取出了静态构造函数(正如Jon在文章末尾所建议的):

第2步:然后,我将“实例”
Singleton
类与我正在使用的
Logging
类交换:

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();
}
我留下的与原来的大不相同。我知道在设置线程安全的单例时很容易出错

所以我想问:我的任何步骤是否会使我的类不再是一个好的单例实现?

我的任何步骤是否使我的类不再是一个好的单例实现

是的,有

无论如何,您在步骤1中删除的行为是一个实现细节。移除空的静态构造函数是可以的;如果您想强制使用lazy init,
lazy
是一种更好的方法,尽管它的开销稍大一些

在步骤#2,您的对象完全不再是单例对象,因为您不再能够控制创建了多少对象实例(
日志记录


我要说的是,根本不是一个单例实现就等于“不是一个好的单例实现”。

这根本不是单例实现。您创建的只是另一种类型的共享静态变量。我想我要找的不是一个简单的单例。我可能需要稍后再发一个问题。谢谢你的回答!如果有人感兴趣,我在这里发布了我的后续问题:
public static class Singleton
{
    public static Logging Instance { get; } = new Logging();
}