Lazy <t>是否应该优先考虑getter中的延迟初始化?</t>

时间:2015-03-06 15:14:46

标签: c# .net lazy-initialization

从.NET 4开始,Lazy<T>可用于懒惰地初始化对象。直观地,懒惰初始化也可以在公共财产的 getter 中执行,以向呼叫者提供相同的功能。我想知道Lazy<T>是否提供了后者的任何固有优势,因此应该优先考虑?

就个人而言,我觉得Lazy<>可以迅速降低代码的可读性,但也许我只是看到它被误用了。从好的方面来说,它确保了线程的安全性,但是有很多.NET同步结构 - 也许我错了 - 让它很容易在getter中实现相同的功能。

选择最佳方法时需要注意哪些注意事项?

1 个答案:

答案 0 :(得分:8)

Lazy<>可能非常有用,因为它也支持多线程,在创建自己的“懒惰”时必须自己构建。

对于不需要多线程的代码,在我看来,这将是性能最佳且可读的代码(使用null-coalescing运算符)。

return variable ?? (variable = new ClassName());

请注意,由于此代码不是线程安全的,因此您最终可能会多次调用new ClassName()

您应该先介绍lock,然后可读性会降低。如果只是为了提高可读性,Lazy<>在这种情况下可能并不那么糟糕。

此外,Lazy<>会阻止您在缓存属性的情况下使用支持字段。