如何创建一个只能在C#中拥有单个实例的类
我想知道是否有一种机制或模式只允许C#中的一个类实例。 我听说过Singleton
类,但我不知道如何使用它。
使用singleton,这是一个只允许创建自身的单个实例的类。
public sealed class Singleton { public static readonly Singleton instance = new Singleton(); private Singleton() {} }
这种模式的操作很简单,可以简化为以下几种:
隐藏Singleton类的构造函数,以便不会实例化客户端。 声明Singleton类私有成员变量,该变量包含对我们处理的唯一实例的引用。 在类Singleton中提供一个函数或属性,该函数或属性提供对Singleton实例维护的函数或属性的访问。
您需要阅读我们自己的Jon Skeet的博客(在C#中实现Singleton模式) 。
Singletom Pattern的意图是“确保一个类只有一个实例,并提供一个全局访问点”。
这是你如何做到的。
public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton Instance { get { return instance; } } }
这可以是Singletone实现的示例
public sealed class CSingleTone { private static CSingleTone instance; public int SomeValue{ get; set; } public static CSingleTone Instance { get { if (instance == null) instance = new CSingleTone(); return instance; } } private CSingleTone() { } }
可以这样使用
int r = CSingleTone.Instance.SomeValue;
单身人士不是一个阶级,而是一个模式。 这是一个例子:
class Singleton { private Singleton() {} static private Singleton GetIt() { return theOne; } static private Singleton theOne = new Singleton(); }
一种选择是仅声明一个只包含static
成员的static
类。 或者,您可以通过为类提供private
构造函数来实现Singleton模式:
public class MySingleton { public static readonly MySingleton Instance = new MySingleton(); private MySingleton() { } // Members ... }
这是一个单例类的简单例子
class Program { static void Main() { SiteStructure s = SiteStructure.Instance; } } public sealed class SiteStructure { static readonly SiteStructure _instance = new SiteStructure(); public static SiteStructure Instance { get { return _instance; } } SiteStructure() { // Initialize. } }
在这里,Readonly允许thread-safety
,这意味着它只能allocated once
。 它有一个public static getter
。 调用者使用Instance property
来获取单例实例。 已知Sealed
允许编译器在JIT compilation
期间执行特殊优化。 上面的最终方法是私有实例构造函数和Initialize方法。 Private constructors
意味着类only allocate itself
。