Với hai phương pháp:gọi thay vì gọi trong trường hợp C# 6 mới? " rỗng kiểm tra
static void M1(Person p)
{
if (p != null)
{
var p1 = p.Name;
}
}
static void M2(Person p)
{
var p1 = p?.Name;
}
Tại sao mã M1 IL sử dụng callvirt
:
IL_0007: brfalse.s IL_0012
IL_0009: nop
IL_000a: ldarg.0
IL_000b: callvirt instance string ConsoleApplication4.Person::get_Name()
và M2 IL sử dụng 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()
Tôi chỉ có thể đoán rằng bởi vì trong M2 chúng tôi biết rằng p
không phải là null và giống như
new MyClass().MyMethod();
Có đúng không?
Nếu có, điều gì xảy ra nếu p
sẽ không có trong chuỗi khác?
Thật tuyệt khi cho biết cách một thành viên ảo thực sự được gọi khi được ghi đè. Cụ thể trong sự hiện diện của '? .'. Hành vi khi một thành viên ghi đè là 'niêm phong' và được triệu gọi cụ thể là gì? Nếu nếu nó vẫn là 'callvirt', nó có thể là một cơ hội tối ưu hóa trong Roslyn :) – leppie
@leppie C# tạo' callvirt' cho việc này. Nhưng tôi không biết điều gì xảy ra trong thời gian chạy. –