在C#中,Lazy
延迟初始化解决了什么问题?
某些对象创建开销大,比如读取大量数据、建立数据库连接或加载复杂配置。如果程序启动时就实例化这些对象,即使后续并不一定用到,也会拖慢启动速度并浪费内存。
Lazy
如何使用 Lazy
基本用法非常简单:
// 定义一个延迟初始化的字符串集合
private static readonly Lazy<List<string>> _expensiveList = new Lazy<List<string>>(() =>
{
// 模拟耗时操作
Thread.Sleep(1000);
return new List<string> { "A", "B", "C" };
});
// 使用时才初始化
List<string> data = _expensiveList.Value; // 第一次调用时才执行初始化
上面的例子中,() => { ... } 是一个委托,定义了如何创建目标对象。这个委托只会在首次访问 .Value 时执行一次,之后重复访问会返回缓存的结果。
线程安全与性能优势
Lazy
你可以通过构造函数指定模式:
new Lazy<List<string>>(initializer, LazyThreadSafetyMode.ExecutionAndPublication);
由于避免了不必要的提前计算和对象分配,Lazy
常见应用场景举例
比如在一个服务类中,某个日志处理器开销大且可能不用:
public class DataService
{
private readonly Lazy<Logger> _logger = new Lazy<Logger>(() => new Logger("log.txt"));
public void DoWork()
{
// 只有出错时才真正创建日志器
if (errorOccured)
_logger.Value.LogError("Something went wrong");
}
}
这样,大多数正常流程不会承担日志器的初始化开销。
基本上就这些。Lazy
