如果我定义了一个惰性值,例如
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/