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()
。
那你应该引入lock
ing,可读性会降低。如果只是为了可读性,Lazy<>
在那种情况下可能还不错。
此外,Lazy<>
会阻止您在缓存属性的情况下使用支持字段。
对于非多线程目的,您可以使用以下安全 getter:
private Foo? _variable;
public Foo Variable => _variable ?? (_variable = DoSomeHeavyTask()).Value;
从 .NET 4 开始,Lazy<T>
可用于延迟初始化对象。直观上,惰性初始化也可以在 public 属性 的 getter 中执行,以向调用者提供相同的功能。我想知道 Lazy<T>
是否比后者有任何内在优势,因此应该是首选?
我个人觉得 Lazy<>
会很快降低代码的可读性,但也许我只是看到它被滥用了。从好的方面来说,它确保了线程安全,但是有许多 .NET 同步结构——也许我错了——使得在 getter.
选择最佳方法时需要注意哪些注意事项?
Lazy<>
很有用,因为它也包含对多线程的支持,这是您在创建自己的 'lazy'.
对于不需要多线程的代码,我认为这将是性能最佳且可读性最好的代码(使用空合并运算符)。
return variable ?? (variable = new ClassName());
请注意,由于此代码不是线程安全的,您最终可能会多次调用 new ClassName()
。
那你应该引入lock
ing,可读性会降低。如果只是为了可读性,Lazy<>
在那种情况下可能还不错。
此外,Lazy<>
会阻止您在缓存属性的情况下使用支持字段。
对于非多线程目的,您可以使用以下安全 getter:
private Foo? _variable;
public Foo Variable => _variable ?? (_variable = DoSomeHeavyTask()).Value;