一文读懂 C# 中的 Lazy<T>
一文读懂 C# 中的 Lazy
- 一、Lazy<T> 是什么
- 二、推荐应用场景
- 三、实战 Demo
-
- 基础用法
- 进阶用法:单例模式的实现
-
- 单例类
- 使用单例类
- 四、核心方法和属性阐释
-
- LazyThreadSafetyMode 枚举值
- 构造函数
- 常用属性
- 五、避坑指南、注意事项
- 六、总结与决策
一文读懂 C# 中的 Lazy
在 C# 编程中,有时我们希望某个对象的初始化过程延迟到真正需要使用它的时候,这样可以提高程序的性能,减少不必要的资源占用。Lazy 类型就为我们提供了这样的功能
一、Lazy 是什么
Lazy 是 C# 中用于延迟初始化的类型。其核心作用就是将对象的创建推迟到首次访问该对象的时候,而不是在声明变量时就进行创建。有以下特点:
- 延迟性:就像你有个任务,但你可以选择在真正要用到这个任务结果的时候才去执行它,而不是一开始就着手去做。Lazy 允许我们把对象的初始化操作推迟到首次访问 Value 属性的时候
- 线程安全性:Lazy 提供了不同级别的线程安全模式,可以确保在多线程环境下对象的正确初始化和访问
Lazy 自.NET Framework 4.0 开始引入。后续版本核心功能稳定,无重大功能或用法变化。只要项目基于.NET Framework 4.0 及以上版本,都能正常使用
二、推荐应用场景
Lazy虽然强大,但并非所有场景都适用。以下这些场景尤其适合它发挥优势:
- 数据库连接:数据库连接的建立通常开销较大。使用 Lazy 可以在真正需要执行数据库操作时才创建连接,避免程序启动时就占用过多资源
- 大型对象创建:比如创建一个庞大的配置对象,初始化过程复杂且可能在程序运行过程中不一定会用到,此时使用 Lazy 可以延迟初始化,提升程序启动速度
- 资源加载:加载文件、图片等资源时,如果不是程序一开始就需要的,通过 Lazy 可以在需要展示或使用这些资源时才进行加载
- 单例模式优化:实现单例模式时,用 Lazy 可以做到线程安全的延迟初始化
三、实战 Demo
基础用法
下面的代码展示了 Lazy 的基本使用,延迟初始化一个简单的字符串对象:
class Program
{static void Main(){// 声明一个 Lazy<string> 对象,推迟字符串的初始化Lazy<string> lazyString = new Lazy<string>(() => "延迟初始化的字符串");// 判断此时字符串是否被创建Console.WriteLine("在访问 Value 之前,字符串是否已初始化: " + lazyString