我有条件
if (driver?.VistrackId == 555)
等价(在IL代码中,而不是C#代码):
if (driver != null && driver.VistrackId == 555)
正确?
答案 0 :(得分:4)
答案 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
它们略有不同