C# ?。条件运算符

时间:2018-03-10 13:08:12

标签: c# conditional

我有条件

if (driver?.VistrackId == 555)

等价(在IL代码中,而不是C#代码):

if (driver != null && driver.VistrackId == 555)

正确?

3 个答案:

答案 0 :(得分:4)

不完全

  

它更好因为这个表示法是线程安全的

请参阅Null-conditional Operators on MSDN

答案 1 :(得分:2)

这是对的。 “?”检查为null,如果它不为null,则为“。”。继续审讯对象

答案 2 :(得分:1)

此代码生成以下IL

var driver = new {VistrackId = 1};

if (driver?.VistrackId == 555)
{
    Console.WriteLine("?. operator");
}

IL:

IL_0000:  nop         
IL_0001:  ldc.i4.1    
IL_0002:  newobj      <>f__AnonymousType0<System.Int32>..ctor
IL_0007:  stloc.0     // driver
IL_0008:  ldloc.0     // driver
IL_0009:  brtrue.s    IL_000E
IL_000B:  ldc.i4.0    
IL_000C:  br.s        IL_001B
IL_000E:  ldloc.0     // driver
IL_000F:  call        <>f__AnonymousType0<System.Int32>.get_VistrackId
IL_0014:  ldc.i4      2B 02 00 00 
IL_0019:  ceq         
IL_001B:  stloc.1     
IL_001C:  ldloc.1     
IL_001D:  brfalse.s   IL_002C
IL_001F:  nop         
IL_0020:  ldstr       "?. operator"
IL_0025:  call        System.Console.WriteLine
IL_002A:  nop         
IL_002B:  nop         
IL_002C:  ret    

代码== null

var driver = new {VistrackId = 1};


if (driver != null && driver.VistrackId == 555)
{
    Console.WriteLine("== null");
}

IL

IL_0000:  nop         
IL_0001:  ldc.i4.1    
IL_0002:  newobj      <>f__AnonymousType0<System.Int32>..ctor
IL_0007:  stloc.0     // driver
IL_0008:  ldloc.0     // driver
IL_0009:  brfalse.s   IL_001A
IL_000B:  ldloc.0     // driver
IL_000C:  callvirt    <>f__AnonymousType0<System.Int32>.get_VistrackId
IL_0011:  ldc.i4      2B 02 00 00 
IL_0016:  ceq         
IL_0018:  br.s        IL_001B
IL_001A:  ldc.i4.0    
IL_001B:  stloc.1     
IL_001C:  ldloc.1     
IL_001D:  brfalse.s   IL_002C
IL_001F:  nop         
IL_0020:  ldstr       "== null"
IL_0025:  call        System.Console.WriteLine
IL_002A:  nop         
IL_002B:  nop         
IL_002C:  ret         

它们略有不同