基于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