2011-09-22 27 views
-1

可能重复:
Which is preferred: Nullable<>.HasValue or Nullable<> == null?安全并正确地从Nullable中提取价值?

我在使用以下两种形式的“安全地”获取值出可空类型的代码库工作。例如,如果foo是可空(INT):

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

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

我倾向于第二种形式,但没有任何特殊背景下这可能使第一(或第二,对于这个问题),在肯定首选其他?

回答

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的代码与您的代码不相同,但您确实应该熟悉这个操作符,因为它确实可以制作出漂亮的代码。

+0

是的,如果编译器符合规范(版本3.0第7.9.9节“相等运算符和空值”),那么它*是*保证编译器将使用Value属性。 – phoog

+0

@phoog:很好。它是C#4规范中的第7.10.9节。将编辑。 –

1

我个人比较喜欢

var value = foo ?? 0; 
+0

这是不一样的,虽然 - 这将改变value'的'值*即使'foo'是null',这是不符合的问题的代码的情况。 –

+0

也许是这样,乔恩,但你会得到,如果'你使用它之前value'未初始化编译错误,所以还不如让被它初始化像安东的默认值的代码更易读使用空合并运算符已建议''??。 – FMM

2

我倾向于使用第二种形式,因为它代表着什么可空其实是 - 有两个成员结构。