Учитывая два метода:
static void M1(Person p)
{
if (p != null)
{
var p1 = p.Name;
}
}
static void M2(Person p)
{
var p1 = p?.Name;
}
Почему код M1 IL использует callvirt
:
IL_0007: brfalse.s IL_0012
IL_0009: nop
IL_000a: ldarg.0
IL_000b: callvirt instance string ConsoleApplication4.Person::get_Name()
и M2 IL используют call
:
brtrue.s IL_0007
IL_0004: ldnull
IL_0005: br.s IL_000d
IL_0007: ldarg.0
IL_0008: call instance string ConsoleApplication4.Person::get_Name()
Я просто могу догадаться, что это потому, что в M2 мы знаем, что p
не является нулевым и его похожее
new MyClass().MyMethod();
Это правда?
Если это так, что, если p
будет null в другом потоке?