检查可空的惰性值

时间:2017-03-22 23:19:01

标签: c#

如果我定义了一个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的可能性。这是正确的假设吗?

1 个答案:

答案 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,因为您不希望拥有多个实例。