安全且正确地从 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 关键字创建的对象(带有属性)?

如何有效地从 JSON 列中提取字段?

如何有效地从大型数据框字典中提取同一列? (性能警告)

Python3:有条件地从具有理解的字典中提取键

如何高效地从BAM文件中提取fastq

如何就地修改数据框,使其 ArrayType 列不能为空(nullable = false 且 containsNull = false)?