如果我定义了一个Lazy值,例如
Lazy<MyObject> _lazyObject = new Lazy<MyObject>();
如果我想检查这个值是不是null,在我调用一个方法之前,我应该选择哪个选项?
if (_lazyObject.IsValueCreated && _lazyObject.Value.Handle == IntPtr.Zero)
{
return false;
}
return _lazyObject.Value.MyMethod();
或
return _lazyObject?.Value?.MyMethod() ?? false;
我更喜欢第二个选项,因为我认为它解释了Lazy对象在获取句柄和进行调用之间可能变为null的可能性。这是正确的假设吗?
答案 0 :(得分:2)
从这个问题来看,目前还不清楚你实际想要解决的问题是什么。除非您在返回null的构造函数中提供工厂,否则_lazyObject.Value
永远不应为null。
例如
var lazy = new Lazy<string>(() => null);
var isNull = lazy.Value == null; // isNull is true
如果正确使用Lazy<>
,则不需要检查null,只需使用该值,然后在那里创建值的任何线程。检查IsValueCreated
会告诉您该值是否已创建,但我不知道为什么您需要知道这一点。
通常,持有Lazy<>
的字段/属性应设为readonly
,因为您不希望拥有多个实例。