如果我定义了一个惰性值,例如

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的可能性。这是正确的假设吗?

最佳答案

从这个问题还不清楚您实际上要解决什么问题。除非您为返回null的构造函数提供工厂,否则_lazyObject.Value绝不应为null。

例如

var lazy = new Lazy<string>(() => null);

var isNull = lazy.Value == null; // isNull is true


如果Lazy<>的使用正确,则无需检查是否为null,只需使用该值,然后到达该线程的任何线程都会首先创建该值。选中IsValueCreated会告诉您该值是否已创建,但是我不知道您为什么需要知道这一点。

通常,由于您不想拥有多个实例,因此应将包含Lazy<>的字段/属性设置为readonly

关于c# - 检查可为空的惰性值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42964459/

10-17 01:57