`n 在C#中如何实现单例模式?

在C#中如何实现单例模式?

Clock Icon 发布时间:2026/9/26 15:39  · 

单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。实现该模式的方式有多种,以下是常见的几种方法。
一种方式是使用懒汉式单例。这种方式在需要实例时才创建对象,避免了不必要的资源消耗。可以通过使用一个私有的静态变量来存储实例,并通过一个公有的静态方法来提供访问。例如:
```csharppublic class Singleton{ private static Singleton instance; private Singleton() { } public static Singleton Instance { get { if (instance == null) { instance = new Singleton(); } return instance; } }}```
在多线程环境下,懒汉式单例可能会出现线程安全问题。为了解决此问题,可以在实例化对象的代码块上添加锁,确保一个时间只有一个线程可以访问。
```csharppublic class Singleton{ private static Singleton instance; private static readonly object lockObject = new object(); private Singleton() { } public static Singleton Instance { get { lock (lockObject) { if (instance == null) { instance = new Singleton(); } return instance; } } }}```
饿汉式单例在类加载时就创建实例,避免了多线程带来的问题。相应地,它也在程序启动时占用了资源,但当需要快速访问实例时更加高效。实现方式如下:
```csharppublic class Singleton{ private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton Instance => instance;}```
除了上述方法,.NET/" style="text-decoration: none; color: inherit;" title="NET">NET中还提供了Lazy类来实现单例。这将确保在第一次访问时才初始化实例,并且实现了线程安全。使用方式如下:
```csharppublic class Singleton{ private static readonly Lazy lazyInstance = new Lazy(() => new Singleton()); private Singleton() { } public static Singleton Instance => lazyInstance.Value;}```
除了实现方式,还需考虑单例类的序列化。为避免序列化后创建新实例,可以重写`GetObjectData`方法并加上`[Serializable]`特性。
应避免在单例类中实现公有构造函数,以防止外部创建实例。还需在实现中考虑复制逻辑,确保不能通过克隆来创建新实例。
单例模式提供了一种确保全局唯一性的方法。其实现方式各有优劣,需根据具体需求和场景进行选择。

推荐文章

热门文章