如果我定义了一个惰性值,例如
Lazy<MyObject> _lazyObject = new Lazy<MyObject>();
如果我想在调用方法之前检查 this 的值不为空,我应该做什么?
if (_lazyObject.IsValueCreated && _lazyObject.Value.Handle == IntPtr.Zero)
{
return false;
}
return _lazyObject.Value.MyMethod();
或
return _lazyObject?.Value?.MyMethod() ?? false;
我更喜欢第二个选项,因为我认为它解释了 Lazy 对象在获取句柄和进行调用之间可能变为 null 的可能性。这是一个正确的假设吗?
最佳答案
从这个问题来看,尚不清楚您实际上想要解决的问题是什么。 _lazyObject.Value
永远不应该为 null,除非您在返回 null 的构造函数中提供一个工厂。
例如
var lazy = new Lazy<string>(() => null);
var isNull = lazy.Value == null; // isNull is true
如果Lazy<>
正确使用时,您不需要检查 null,您只需使用该值,无论线程首先到达那里,都会创建该值。检查IsValueCreated
会告诉您该值是否已创建,但我不知道为什么您需要知道这一点。
通常是持有 Lazy<>
的字段/属性应该做readonly
因为您不想有多个实例。
关于c# - 检查可为 null 的惰性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964459/