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

Should Lazy<T> be preferred to lazy initialization in a getter?

从 .NET 4 开始,Lazy<T> 可用于延迟初始化对象。直观上,惰性初始化也可以在 public 属性 的 getter 中执行,以向调用者提供相同的功能。我想知道 Lazy<T> 是否比后者有任何内在优势,因此应该是首选?

我个人觉得 Lazy<> 会很快降低代码的可读性,但也许我只是看到它被滥用了。从好的方面来说,它确保了线程安全,但是有许多 .NET 同步结构——也许我错了——使得在 getter.

中实现相同的功能变得很容易

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

Lazy<> 很有用,因为它也包含对多线程的支持,这是您在创建自己的 'lazy'.

时必须自己构建的东西

对于不需要多线程的代码,我认为这将是性能最佳且可读性最好的代码(使用空合并运算符)。

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

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

那你应该引入locking,可读性会降低。如果只是为了可读性,Lazy<> 在那种情况下可能还不错。

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

对于非多线程目的,您可以使用以下安全 getter:

private Foo? _variable;

public Foo Variable => _variable ?? (_variable = DoSomeHeavyTask()).Value;