C# 安全正确地从Nullable中提取值?
可能重复:C# 安全正确地从Nullable中提取值?,c#,syntax,null,nullable,C#,Syntax,Null,Nullable,可能重复: 我在一个代码库中工作,它使用以下两种形式“安全地”从可空类型中获取值。例如,如果foo是可为空的(int?): if(foo!=null){ value=(int)foo; } if(foo.HasValue){ 价值=食品价值; } 我更喜欢第二种形式,但是否有任何特定的上下文会使第一种形式(或第二种形式,就此而言)比另一种形式更受欢迎?我个人更喜欢 var value = foo ?? 0; 我倾向于使用第二种形式,因为它表示一个可为null的结构实际上是什么——一个有两个
我在一个代码库中工作,它使用以下两种形式“安全地”从可空类型中获取值。例如,如果
foo
是可为空的(int?):
if(foo!=null){
value=(int)foo;
}
if(foo.HasValue){
价值=食品价值;
}
我更喜欢第二种形式,但是否有任何特定的上下文会使第一种形式(或第二种形式,就此而言)比另一种形式更受欢迎?我个人更喜欢
var value = foo ?? 0;
我倾向于使用第二种形式,因为它表示一个可为null的结构实际上是什么——一个有两个成员的结构。第一种和第二种形式完全等效,并编译成相同的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
IL_000b:ldloca.s V_1
IL_000d:调用实例bool valuetype
[mscorlib]System.Nullable`1::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:没有
IL_001a:ldloca.s V_1
IL_001c:呼叫实例!0值类型
[mscorlib]System.Nullable`1::get_Value()
IL_0021:stloc.0
这由C#4规范第7.10.9节(或其他版本中的同等规范)保证
基本上-使用您和您的团队认为更具可读性的任何形式
Anton强调了-虽然Anton的代码与您的代码不同,但这是一个您肯定应该熟悉的运算符,因为它确实可以生成很好的代码。但这不一样-这将更改
value
*的值,即使foo
为null`,这与问题中的代码不同。也许是这样,Jon,但是如果在使用前未初始化值
,则会出现编译错误,因此最好将代码初始化为默认值,使其更具可读性,就像Anton建议使用空合并运算符?
。是的,可以保证编译器将使用value属性,如果编译器符合规范(版本3.0第7.9.9节“相等运算符和null”)。@phoog:Good catch。C#4规范中的第7.10.9节将进行编辑。