### C#中的单例模式详解 #### 一、引言 单例模式是软件设计模式中最为基础且常用的一种模式,其主要目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。在实际开发过程中,单例模式经常被用于创建日志对象、对话框、缓存数据等场景,尤其是在资源有限或者需要频繁访问的场合。 在C#中,单例模式可以通过多种方式实现,如Eager Initialization(急切初始化)、Lazy Initialization(懒惰初始化)以及线程安全的懒惰加载等。本文将重点介绍C#中两种不同的单例模式实现方法:基于嵌套类的完全懒惰加载和使用.NET 4.0的`Lazy<T>`类型。 #### 二、基于嵌套类的完全懒惰加载 ##### 2.1 实现原理 此实现方式利用了C#中的静态构造函数以及内部嵌套类来实现单例模式。外部无法直接通过new关键字创建实例,而是通过内部定义的嵌套类来间接创建,这样可以保证在任何时候都只有一个实例被创建。 ##### 2.2 代码实现 ```csharp public sealed class Singleton { private Singleton() { } public static Singleton Instance { get { return Nested.instance; } } private class Nested { // 显式静态构造函数告诉编译器不要标记类型为 before field init static Nested() { } internal static readonly Singleton instance = new Singleton(); } } ``` ##### 2.3 解析 1. **私有构造函数**:确保外部不能通过new关键字直接创建实例。 2. **嵌套类Nested**:包含一个静态字段`instance`,它是`Singleton`类型的唯一实例。同时,`Nested`类还有一个静态构造函数,确保`instance`在第一次被引用时才被创建。 3. **静态属性Instance**:提供了一个公共接口,使得可以从外部获取`Singleton`的唯一实例。 ##### 2.4 特点 - **延迟加载**:首次访问`Singleton.Instance`时才创建实例,实现了懒惰加载。 - **线程安全性**:由于`Nested`类的静态构造函数保证了实例的创建过程是线程安全的。 #### 三、使用.NET 4.0的`Lazy<T>`类型 ##### 3.1 实现原理 自.NET 4.0起,Microsoft引入了一个名为`Lazy<T>`的泛型类型,它可以用于创建延迟初始化的对象。`Lazy<T>`类负责管理一个值的创建过程,并提供了`Value`属性,该属性会在第一次被调用时自动创建并返回这个值。 ##### 3.2 代码实现 ```csharp public sealed class Singleton { private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton()); public static Singleton Instance { get { return lazy.Value; } } private Singleton() { } } ``` ##### 3.3 解析 1. **私有构造函数**:与之前相同,防止外部直接创建实例。 2. **静态字段`lazy`**:使用`Lazy<Singleton>`类型存储实例,初始化时传递一个lambda表达式作为工厂方法,该方法在`lazy.Value`首次被访问时执行。 3. **静态属性`Instance`**:提供一个公共接口,通过`lazy.Value`获取唯一实例。 ##### 3.4 特点 - **延迟加载**:只有当`Singleton.Instance`首次被访问时才会创建实例。 - **线程安全性**:`Lazy<T>`类型内部已经实现了线程安全的机制,无需额外考虑多线程环境下的同步问题。 #### 四、总结 单例模式是C#中非常实用的设计模式之一,它可以帮助我们更好地管理资源,减少不必要的实例化操作。无论是基于嵌套类的完全懒惰加载还是使用.NET 4.0的`Lazy<T>`类型,都能很好地满足不同场景的需求。开发者可以根据实际情况选择最适合的方法来实现单例模式。


























Under .net 4.0 fully lazy instantiation
public sealed class Singleton
{
private Singleton()
{
}
public static Singleton Instance { get { return Nested.instance; } }
private class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
Using .NET 4's Lazy<T> type
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy =
new Lazy<Singleton>(() => new Singleton());


- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- C语言程序设计实训题目一.doc
- 《信息化进程中的教育技术发展研究》子课题《网络环境下的中职教育理论与实践探索》研--究--报--告.doc
- 计算机数据库入侵检测技术应用.docx
- 基于单片机的电子钟的方案设计书(1)1.doc
- 网络空间安全新形势下的信息安全人才培养.doc
- 童发发的大模型学习之旅
- 自动化生产设备方案.ppt
- 第一节办公自动化基础知识.ppt
- 全国计算机等级考试二级教程MSOffice高级应用.ppt
- 递进式应用型人工智能专业实践教学体系探究.docx
- 新建供欲提高CAD制图画图速度者参考.doc
- 计算机应用技术期末复习题.doc
- 汽车电子商务课程标准.docx
- 基于PLC多层电梯电气设计与调试正板doc.doc
- 加强高校学生网络安全教育研究.docx
- 基于Hadoop平台的大数据应用系统解决方案.docx


