我正在审查一些遗留代码,并遇到了一个似乎会引发不需要的异常的片段。本质上,代码(EntityFramework 查询)如下所示:
var serviceId = (Guid?) person.Services.FirstOrDefault(s => s.Name == "foo").Id;
bool inService = serviceId.HasValue;
也就是说, aperson
有多个服务分配给它们,我们返回的是第一个Name
服务foo
。然后,我们获取该Service
实例的 Id 属性(一个 Guid),并将其强制转换为可为空的 Guid。最后,如果该可为空的 Guid 具有值,则此人必须在该服务中。
(注意:这不是我选择上面写的方式,这正是我正在使用的)
我有一种感觉,当这个人不属于名为“foo”的服务(或者实际上,任何服务)时,这段代码只会抛出异常,因为FirstOrDefault
调用将返回一个null
Service
实例,并且访问该Id
属性只会抛出一个NPE。
我向原始开发人员询问了此代码段,并被告知执行以下操作:
(T?) entity.<non-existent entity>.SomeProperty
将简单地返回一个空对象,而不是抛出一个 NPE。此外,这种类型的“安全 null 处理”发生在 Entity Framework 查询中。
这似乎令人难以置信的违反直觉,甚至感觉不应该是可能的。我试着研究这个,但我没有发现任何类似的东西。有人对这个有经验么?我 100% 很高兴发现自己错了并学到了新东西,但这对我来说并不正确。
作为附录,我确实尝试使用 EntityFramework 连接在 Linqpad 中运行上面的查询,并且在尝试访问空对象属性时确实生成了 NPE