从.NET 4开始,Lazy<T>
可用于懒惰地初始化对象。直观地,懒惰初始化也可以在公共财产的 getter 中执行,以向呼叫者提供相同的功能。我想知道Lazy<T>
是否提供了后者的任何固有优势,因此应该优先考虑?
就个人而言,我觉得Lazy<>
可以迅速降低代码的可读性,但也许我只是看到它被误用了。从好的方面来说,它确保了线程的安全性,但是有很多.NET同步结构 - 也许我错了 - 让它很容易在getter中实现相同的功能。
选择最佳方法时需要注意哪些注意事项?
答案 0 :(得分:8)
Lazy<>
可能非常有用,因为它也支持多线程,在创建自己的“懒惰”时必须自己构建。
对于不需要多线程的代码,在我看来,这将是性能最佳且可读的代码(使用null-coalescing运算符)。
return variable ?? (variable = new ClassName());
请注意,由于此代码不是线程安全的,因此您最终可能会多次调用new ClassName()
。
您应该先介绍lock
,然后可读性会降低。如果只是为了提高可读性,Lazy<>
在这种情况下可能并不那么糟糕。
此外,Lazy<>
会阻止您在缓存属性的情况下使用支持字段。