Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 安全正确地从Nullable中提取值?_C#_Syntax_Null_Nullable - Fatal编程技术网

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节将进行编辑。