Lazy <T>是否应该优先选择getter中的延迟初始化?

w12*_*128 7 .net c# lazy-initialization

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

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

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

Pat*_*man 8

Lazy<> 可能很有用,因为它也支持多线程,你必须在创建自己的'懒惰'时自己构建.

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

return variable ?? (variable = new ClassName());
Run Code Online (Sandbox Code Playgroud)

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

那么你应该介绍lock,并且可读性会降低.如果只是为了可读性,Lazy<>在这种情况下可能并不那么糟糕.

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

  • @ w128我永远不会使用"某种类型的锁定"而不是使用`Lazy <T>`,因为`Lazy <T>`已经为你做了所有这些. (2认同)
  • @ w128要明确的是,如果我不需要提供线程安全性,我不会使用Lazy <T>(除非我认为我将来可能需要添加它一段时间). (2认同)