C# 的 Lazy<T> 类型
Lazy<T> 是 C# 中的一个类,用于实现延迟初始化(懒加载)模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象,直到第一次实际需要时才进行初始化。
主要特点
-
延迟初始化:对象只有在第一次被访问时才会创建
-
线程安全:默认情况下是线程安全的,可以确保在多线程环境中只初始化一次
-
性能优化:避免不必要的资源消耗,特别是对于可能不会使用的资源
基本用法
// 创建一个延迟初始化的对象
Lazy<ExpensiveObject> lazyObject = new Lazy<ExpensiveObject>();// 实际访问时才会创建对象
ExpensiveObject obj = lazyObject.Value;
构造函数选项
-
无参数构造函数:使用类型的默认构造函数
Lazy<MyClass> lazy = new Lazy<MyClass>();
-
使用初始化函数:
Lazy<MyClass> lazy = new Lazy<MyClass>(() => new MyClass("param"));
-
指定线程安全模式:
// 非线程安全模式(性能更高,适用于单线程) Lazy<MyClass> lazy = new Lazy<MyClass>(LazyThreadSafetyMode.None);
实际应用场景
-
大型资源(如图像、文件)的延迟加载
-
数据库连接的延迟建立
-
计算密集型对象的延迟创建
-
依赖注入框架中的服务延迟实例化
示例
public class ExpensiveService
{public ExpensiveService(){Console.WriteLine("ExpensiveService created!");// 模拟耗时初始化Thread.Sleep(1000);}public void DoWork() => Console.WriteLine("Working...");
}class Program
{static void Main(){Lazy<ExpensiveService> lazyService = new Lazy<ExpensiveService>();Console.WriteLine("Lazy object created, but service not initialized yet");// 只有在访问Value属性时才会初始化lazyService.Value.DoWork();// 后续访问不会重新初始化lazyService.Value.DoWork();}
}
输出:
Lazy object created, but service not initialized yet
ExpensiveService created!
Working...
Working...
Lazy<T> 是优化应用程序性能和资源使用的重要工具,特别是在对象创建成本高但可能不需要的情况下。