这个单例实现是否正确并且是线程安全的?
class Class
{
public static readonly Class Instance;
static Class()
{
Instance = new Class();
}
private Class() {}
}
答案 0 :(得分:12)
从技术上讲,您的版本应该可行。但是,我不建议在Singleton类中公开公共字段,而是更喜欢使用Property(仅使用getter)。如果您以后需要进行更改,这将有助于您的API未来发展。我还建议密封任何单例实现,因为子类化单例类几乎总是一个坏主意并且有问题。
如果您的目标是.NET 3.5或更早版本,我个人会在C#中使用以下内容:
public sealed class Singleton
{
static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get
{
return instance;
}
}
static Singleton() { }
private Singleton() { }
}
如果您使用的是.NET 4,则可以通过Lazy<T>
让自己更轻松:
public sealed class Singleton
{
private static readonly Lazy<Singleton> instance = new Lazy<Singleton>( () => new Singleton() );
private Singleton() {}
public static Singleton Instance { get { return instance.Value; } }
}
.NET 4版本还具有完全延迟的优点 - 即使您的Singleton
类具有在访问“Instance”属性之前使用的其他静态方法。您也可以使用私有的嵌套类来完成一个完全懒惰的.NET 3.5版本。 Jon Skeet demonstrated this on his blog
答案 1 :(得分:2)
是。我也会上课“sealed
”以避免将来出现任何混淆。
答案 2 :(得分:1)
如何做到这一点的好讨论在这里:
答案 3 :(得分:1)
您应该在变量声明中进行初始化:
public static readonly Class Instance = new Class();