Lazy是C#中实现延迟初始化的泛型类,仅在首次访问Value属性时创建实例,支持线程安全模式控制,适用于高开销或非必需对象的按需加载。

Lazy
基本用法
使用 Lazy
LazylazyObject = new Lazy (() => new ExpensiveObject()); // 此时并未创建实例 // ...
// 第一次访问 Value 时才会创建 ExpensiveObject obj = lazyObject.Value; // 实例化发生在这里
只有第一次调用 Value 属性时,内部的工厂函数才会执行,之后的所有访问都会返回同一个缓存实例。
线程安全控制
Lazy
- LazyThreadSafetyMode.ExecutionAndPublication:默认模式,确保只有一个线程初始化,其他等待。
- LazyThreadSafetyMode.None:不保证线程安全,性能更高,适合单线程场景。
- LazyThreadSafetyMode.PublicationOnly:允许多个线程同时初始化,但只保留第一个结果。
// 禁用线程安全 var lazyNoSync = new Lazy(() => new ExpensiveObject(), LazyThreadSafetyMode.None);
应用场景示例
常见于以下情况:
- 加载大型配置对象,但程序运行中未必会用到。
- 创建数据库连接或文件读取器,避免提前占用资源。
- 在属性中封装延迟加载逻辑。
public class ServiceManager
{
private readonly Lazy _logger = new Lazy(() => new Logger("log.txt"));
public Logger GetLogger()
{
return _logger.Value; // 需要时才创建日志器
}}
基本上就这些。Lazy










