Lazy
基本用法
使用 Lazy
Lazy<ExpensiveObject> lazyObject = new Lazy<ExpensiveObject>(() => new ExpensiveObject()); <p>// 此时并未创建实例 // ...</p><p>// 第一次访问 Value 时才会创建 ExpensiveObject obj = lazyObject.Value; // 实例化发生在这里</p>
只有第一次调用 Value 属性时,内部的工厂函数才会执行,之后的所有访问都会返回同一个缓存实例。
线程安全控制
Lazy
// 禁用线程安全
var lazyNoSync = new Lazy<ExpensiveObject>(() => new ExpensiveObject(),
LazyThreadSafetyMode.None);
应用场景示例
常见于以下情况:
加载大型配置对象,但程序运行中未必会用到。 创建数据库连接或文件读取器,避免提前占用资源。 在属性中封装延迟加载逻辑。
public class ServiceManager
{
private readonly Lazy<Logger> _logger = new Lazy<Logger>(() => new Logger("log.txt"));
<pre class='brush:php;toolbar:false;'>public Logger GetLogger()
{
return _logger.Value; // 需要时才创建日志器
}}
基本上就这些。Lazy
