安全且正确地从Nullable中提取值

本文关键字:提取 Nullable 正确地 安全 | 更新日期: 2023-09-27 18:09:36

可能重复:
首选项:Nullable<gt;。HasValue或Nullable<gt;==无效的

我正在使用一个代码库,它使用以下两种形式来"安全"地从Nullable类型中获取值。例如,如果foo是可为null的(int?(:

if (foo != null) {
    value = (int)foo;
}
if (foo.HasValue) {
    value = foo.Value;
}

我更喜欢第二种形式,但有没有任何特定的背景可以使第一种(或第二种,就这一点而言(肯定比另一种更受欢迎?

安全且正确地从Nullable中提取值

第一个和第二个完全等价,并编译到相同的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合并运算符-虽然Anton的代码与您的代码不等价,但它是一个您绝对应该熟悉的运算符,因为它确实可以生成漂亮的代码。

我倾向于使用第二种形式,因为它代表了Nullable的实际含义——一个有两个成员的结构。

我个人更喜欢

var value = foo ?? 0;