安全且正确地从 Nullable 中提取价值? [复制]
Posted
技术标签:
【中文标题】安全且正确地从 Nullable 中提取价值? [复制]【英文标题】:Safely and properly pulling value from Nullable? [duplicate] 【发布时间】:2011-11-23 01:59:22 【问题描述】:可能重复:Which is preferred: Nullable<>.HasValue or Nullable<> == null?
我正在使用以下两种形式“安全”地从 Nullable 类型中获取值的代码库中工作。例如,如果 foo
是 Nullable (int?):
if (foo != null)
value = (int)foo;
if (foo.HasValue)
value = foo.Value;
我更喜欢第二种形式,但是否有任何特定的上下文可能使第一种(或第二种,就此而言)肯定优于另一种?
【问题讨论】:
【参考方案1】:第一个和第二个完全相同等效,并编译为相同的 IL。
编辑:它们确实会生成相同的 IL,如下所示:
IL_000b: ldloca.s V_1
IL_000d: call instance bool valuetype
[mscorlib]System.Nullable`1<int32>::get_HasValue()
IL_0012: ldc.i4.0
IL_0013: ceq
IL_0015: stloc.2
IL_0016: ldloc.2
IL_0017: brtrue.s IL_0023
IL_0019: nop
IL_001a: ldloca.s V_1
IL_001c: call instance !0 valuetype
[mscorlib]System.Nullable`1<int32>::get_Value()
IL_0021: stloc.0
C# 4 规范的第 7.10.9 节(或其他版本中的等效内容)保证了这一点。
基本上 - 使用您和您的团队认为更具可读性的任何形式。
Anton 突出显示了null-coalescing operator - 虽然 Anton 的代码与您的代码不同,但它是您绝对应该熟悉的运算符,因为它确实可以编写出很好的代码。
【讨论】:
是的,它是保证编译器将使用 Value 属性,如果编译器符合规范(版本 3.0 第 7.9.9 节,“相等运算符和 null” )。 @phoog:很好。这是 C# 4 规范中的第 7.10.9 节。将编辑。【参考方案2】:我倾向于使用第二种形式,因为它表示 Nullable 实际上是什么——一个具有两个成员的结构。
【讨论】:
【参考方案3】:我个人比较喜欢
var value = foo ?? 0;
【讨论】:
虽然不一样 - 这将改变value
的值 *即使 foo
为 null`,问题中的代码并非如此。
可能是这样,Jon,但如果 value
在您使用之前未初始化,您会收到编译错误,因此不妨将代码初始化为像 Anton 这样的默认值,使其更具可读性建议使用空合并运算符??
。以上是关于安全且正确地从 Nullable 中提取价值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何安全地从内存中清除使用 new 关键字创建的对象(带有属性)?
如何就地修改数据框,使其 ArrayType 列不能为空(nullable = false 且 containsNull = false)?