Tôi đã so sánh mã CIL của mã được tạo (đảm bảo tạo Bản phát hành - với Mã Optimize được chọn trong Thuộc tính dự án, tương ứng với công tắc /optimize
trên csc.exe
). Đây là những gì tôi nhận được (sử dụng VS 2008 - lưu ý rằng Foo.MaybeFoo()
là một phương pháp mà đôi khi trả null
, đôi khi một Foo
)
GetFooWithIf
:
IL_0000: call class Application3.Foo Application3.Foo::MaybeFoo()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: brtrue.s IL_000f
IL_0009: newobj instance void Application3.Foo::.ctor()
IL_000e: stloc.0
IL_000f: ldloc.0
IL_0010: ret
GetFooWithCoalescingOperator
:
IL_0000: call class Application3.Foo Application3.Foo::MaybeFoo()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: dup
IL_0008: brtrue.s IL_0010
IL_000a: pop
IL_000b: newobj instance void Application3.Foo::.ctor()
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: ret
Như vậy, tương tự, ngoại trừ một bản sao xếp chồng lên nhau và pop. Nếu điều này có thể được thực hiện để tạo ra sự khác biệt hiệu suất có thể đo lường được, tôi sẽ mua một chiếc mũ đặc biệt cho mục đích ăn nó; do đó, đi với một trong đó bạn cảm thấy cung cấp khả năng đọc tốt hơn.
(chỉnh sửa) oh và JITter có thể đủ thông minh để loại bỏ ngay cả sự khác biệt đó!
Bạn tạo lập luận thuyết phục cho toán tử '?? =' :) –
@PavelMinaev trong trường hợp này, không giống với toán tử '|| ='? Nó sẽ phải thay thế một cuộc gọi 'if (! Isset (myFoo)) myFoo = new Foo();' để đảm bảo toán tử riêng của nó –
Nó không giống nhau, vì '||' yêu cầu một giá trị Boolean. –