[英]c# ?. conditional operator
我有病
if (driver?.VistrackId == 555)
它等效(在IL代碼中,不是C#代碼中):
if (driver != null && driver.VistrackId == 555)
對?
沒錯 “?” 檢查是否為空,如果不為空,則檢查“。” 繼續對物體的訊問
此代碼生成以下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.