Apakah mungkin untuk mempersingkat pernyataan ini?
if (obj != null)
obj.SomeMethod();
karena saya sering menulis ini dan itu sangat mengganggu. Satu-satunya hal yang dapat saya pikirkan adalah menerapkan pola Objek Null , tetapi bukan itu yang dapat saya lakukan setiap saat dan tentu saja ini bukan solusi untuk mempersingkat sintaks.
Dan masalah serupa dengan acara, di mana
public event Func<string> MyEvent;
lalu panggil
if (MyEvent != null)
MyEvent.Invoke();
Jawaban:
Dari C # 6 dan seterusnya, Anda bisa menggunakan:
atau:
Ini
?.
adalah operator yang menyebarkan null, dan akan menyebabkan.Invoke()
hubung singkat saat operannyanull
. Operand hanya diakses sekali, jadi tidak ada risiko masalah "perubahan nilai antara check dan pemanggilan".===
Sebelum C # 6, tidak: tidak ada sihir yang aman-null, dengan satu pengecualian; metode ekstensi - misalnya:
sekarang ini valid:
Dalam kasus event, ini memiliki keuntungan juga karena menghapus kondisi balapan, yaitu Anda tidak memerlukan variabel sementara. Jadi biasanya Anda membutuhkan:
tetapi dengan:
kita dapat menggunakan secara sederhana:
sumber
?.
- dalam VB14 dan lebih tinggiApa yang Anda cari adalah Null Bersyarat (tidak "penggabungan") Operator:
?.
. Ini tersedia mulai C # 6.Contoh Anda adalah
obj?.SomeMethod();
. Jika obj nol, tidak ada yang terjadi. Ketika metode memiliki argumen, misalnyaobj?.SomeMethod(new Foo(), GetBar());
argumen tidak dievaluasi jikaobj
nol, yang penting jika mengevaluasi argumen akan memiliki efek samping.Dan perangkaian dimungkinkan:
myObject?.Items?[0]?.DoSomething()
sumber
Metode ekstensi cepat:
contoh:
atau sebagai alternatif:
contoh:
sumber
Acara dapat diinisialisasi dengan delegasi default kosong yang tidak pernah dihapus:
Tidak perlu pemeriksaan null.
[ Pembaruan , terima kasih kepada Bevan karena telah menunjukkan hal ini]
Waspadai kemungkinan dampak kinerja. Tolok ukur mikro cepat yang saya lakukan menunjukkan bahwa menangani acara tanpa pelanggan 2-3 kali lebih lambat saat menggunakan pola "delegasi default". (Pada laptop 2.5GHz dual core saya, artinya 279ms: 785ms untuk meningkatkan 50 juta acara yang tidak berlangganan.). Untuk hot spot aplikasi, itu mungkin menjadi masalah untuk dipertimbangkan.
sumber
Ya, di C # 6.0 - https://msdn.microsoft.com/en-us/magazine/dn802602.aspx .
sumber
Ini artikel oleh Ian Griffiths memberikan dua solusi yang berbeda untuk masalah yang ia menyimpulkan trik rapi yang Anda tidak harus menggunakan.
sumber
Metode perpanjangan cerating seperti yang disarankan tidak benar-benar menyelesaikan masalah dengan kondisi ras, melainkan menyembunyikannya.
Seperti yang dinyatakan kode ini adalah padanan elegan untuk solusi dengan variabel sementara, tapi ...
Masalah dengan keduanya adalah mungkin pelanggan acara dapat dipanggil SETELAH itu telah berhenti berlangganan dari acara tersebut . Hal ini dimungkinkan karena unsubscription dapat terjadi setelah instance delegasi disalin ke variabel temp (atau diteruskan sebagai parameter dalam metode di atas), tetapi sebelum delegasi dipanggil.
Secara umum, perilaku kode klien tidak dapat diprediksi dalam kasus seperti ini: status komponen tidak dapat mengizinkan untuk menangani pemberitahuan kejadian. Mungkin saja untuk menulis kode klien sebagai cara untuk menanganinya, tetapi itu akan menempatkan tanggung jawab yang tidak perlu kepada klien.
Satu-satunya cara yang diketahui untuk memastikan keamanan utas adalah dengan menggunakan pernyataan kunci untuk pengirim acara. Ini memastikan bahwa semua subscription \ unsubscriptions \ invocation adalah serial.
Agar lebih akurat, kunci harus diterapkan ke objek sinkronisasi yang sama yang digunakan dalam metode add \ remove event accessor yang menjadi default 'ini'.
sumber
Saya setuju dengan jawaban Kenny Eliasson. Pergi dengan metode Ekstensi. Berikut adalah ikhtisar singkat tentang metode ekstensi dan metode IfNotNull yang Anda perlukan.
Metode Ekstensi (metode IfNotNull)
sumber
Mungkin tidak lebih baik tetapi menurut saya lebih mudah dibaca adalah dengan membuat metode ekstensi
sumber
return obj == null
maksudnya Apa yang akan dikembalikanobj
adalahnull
metode akan kembalitrue
, saya pikir.null
? Saya cukup yakin ini tidak berfungsi dengan metode tipe itu sendiri, jadi saya ragu itu akan berfungsi dengan metode ekstensi juga. Saya percaya cara terbaik untuk memeriksa apakah sebuah objek adalahnull
adalahobj is null
. Sayangnya, untuk memeriksa apakah sebuah objek tidak tidaknull
membutuhkan pembungkus dalam tanda kurung, yang sangat disayangkan.Ada operator null yang kurang dikenal di C # untuk ini, ??. Semoga bermanfaat:
http://weblogs.asp.net/scottgu/archive/2007/09/20/the-new-c-null-coalescing-operator-and-using-it-with-linq.aspx
sumber