c# - 检查可为 null 的惰性值

标签 c#

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

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/

相关文章:

c# - 如何在组合框的顶部插入项目?

c# - 在WiX安装中从C#自定义操作调用PowerShell命令

c# - 如何使用 slider 在两个 TreeView 中同步滚动

c# - Rx 的真实世界示例

c# - 如何获取设备名称?

c# - .net mvc JWT token 更改 utf-8 字符

c# - 这个延迟加载缓存实现是线程安全的吗?

c# - 是否可以在 Controller 中使用 UpdateModel 来填充对象?

c# - 将报表设计器集成到 .NET 应用程序中的最佳方法是什么?

c# - SQL 'Execute As' 登录命令和 Linq to SQL