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