簡體   English   中英

C# ?。 條件運算符

[英]c# ?. conditional operator

我有病

if (driver?.VistrackId == 555)

它等效(在IL代碼中,不是C#代碼中):

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

對?

不完全是

更好,因為這種表示法是線程安全的

請參閱MSDN上的空條件運算符

沒錯 “?” 檢查是否為空,如果不為空,則檢查“。” 繼續對物體的訊問

此代碼生成以下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_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         

它們略有不同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM