从Nullable安全妥善地提升价值?

时间:2011-09-22 18:11:19

标签: c# syntax null nullable

  

可能重复:
  Which is preferred: Nullable<>.HasValue or Nullable<> == null?

我正在使用以下两种形式的代码库,以“安全地”从Nullable类型中获取值。例如,如果foo是Nullable(int?):

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

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

我更喜欢第二种形式,但有没有任何特定的背景可能会使第一种(或第二种,相比之下)肯定优先于另一种形式?

3 个答案:

答案 0 :(得分:3)

第一个和第二个完全等价,并编译为相同的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的代码与你的代码不同,它是一个你绝对应该熟悉的运算符,因为它可以真正实现漂亮的代码。

答案 1 :(得分:2)

我倾向于使用第二种形式,因为它代表了Nullable实际上是什么 - 一个有两个成员的结构。

答案 2 :(得分:1)

我个人更喜欢

var value = foo ?? 0;