Saya tahu cara standar menggunakan operator penggabungan Null di C # adalah dengan menetapkan nilai default.
string nobody = null;
string somebody = "Bob Saget";
string anybody = "";
anybody = nobody ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"
Tapi untuk apa lagi bisa ??
digunakan? Tampaknya tidak berguna seperti operator ternary, selain lebih ringkas dan lebih mudah dibaca daripada:
nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget
Jadi mengingat bahwa lebih sedikit yang tahu tentang operator penggabungan nol ...
Apakah Anda pernah menggunakan yang
??
lain?Apakah
??
diperlukan, atau jika Anda hanya menggunakan operator ternary (yang paling akrab dengan)
Saya telah menggunakannya sebagai pemuat satu baris yang malas:
Dibaca? Putuskan sendiri.
sumber
Saya menemukan ini berguna dalam dua cara "sedikit aneh":
out
parameter saat menulisTryParse
rutinitas (yaitu mengembalikan nilai nol jika parsing gagal)Yang terakhir membutuhkan sedikit lebih banyak informasi. Biasanya ketika Anda membuat perbandingan dengan beberapa elemen, Anda perlu melihat apakah bagian pertama dari perbandingan (misalnya usia) memberikan jawaban yang pasti, kemudian bagian berikutnya (misalnya nama) hanya jika bagian pertama tidak membantu. Menggunakan operator penggabungan nol berarti Anda dapat menulis perbandingan yang cukup sederhana (baik untuk pemesanan atau kesetaraan). Misalnya, menggunakan beberapa kelas pembantu di MiscUtil :
Memang sekarang saya memiliki ProjectionComparer di MiscUtil, bersama dengan beberapa ekstensi, yang membuat hal semacam ini lebih mudah - tetapi masih rapi.
Hal yang sama dapat dilakukan untuk memeriksa kesetaraan referensi (atau nullity) pada awal penerapan Equals.
sumber
Keuntungan lain adalah bahwa operator ternary memerlukan evaluasi ganda atau variabel sementara.
Pertimbangkan ini, misalnya:
sementara dengan operator ternary Anda dibiarkan:
yang memanggil MyMethod dua kali, atau:
Either way, operator penggabungan nol lebih bersih dan, saya kira, lebih efisien.
sumber
MyMethod()
memiliki efek samping apa pun.MyMethod()
tidak memiliki efek di luar pengembalian nilai, kompiler tahu untuk tidak menyebutnya dua kali, jadi Anda benar-benar tidak perlu khawatir tentang efisiensi di sini di sebagian besar kasus.MyMethod()
urutan rantai objek bertitik. Contoh:myObject.getThing().getSecondThing().getThirdThing()
MyMethod
identik dalam konteks ini, dengan asumsi ituMyMethod
adalah fungsi Murni. Pilihan lain adalah Memoisasi Otomatis atau fungsi tutup cache. Di sisi lain: en.wikipedia.org/wiki/Global_value_numberingSatu hal yang perlu dipertimbangkan adalah bahwa operator gabungan tidak memanggil metode get properti dua kali, seperti yang dilakukan ternary.
Jadi ada skenario di mana Anda tidak boleh menggunakan ternary, misalnya:
Jika Anda menggunakan:
pengambil akan dipanggil dua kali dan
count
variabel akan sama dengan 2, dan jika Anda menggunakan:yang
count
variabel akan sama dengan 1, sebagaimana mestinya.sumber
??
adalah setara dengan?:
.Keuntungan terbesar yang saya temukan kepada
??
operator adalah Anda dapat dengan mudah mengkonversi tipe nilai yang dapat dibatalkan menjadi tipe yang tidak dapat dibatalkan:Saya sering menggunakan ini dalam permintaan Linq:
sumber
kvp == null
. Dan sebenarnyaNullable<T>
memilikiGetValueOrDefault
metode yang biasa saya gunakan.Saya sudah menggunakan ?? dalam implementasi IDataErrorInfo saya:
Jika ada properti individu dalam keadaan "kesalahan" saya mendapatkan kesalahan itu, kalau tidak saya akan null. Bekerja dengan sangat baik.
sumber
this["Name"]
,this["Address"]
, dll ??Anda dapat menggunakan operator penggabungan nol untuk membuatnya sedikit lebih bersih untuk menangani case di mana parameter opsional tidak diatur:
sumber
arg ?= Arg.Default
?Saya suka menggunakan operator penggabungan nol untuk malas memuat properti tertentu.
Contoh yang sangat sederhana (dan dibuat-buat) hanya untuk mengilustrasikan poin saya:
sumber
Sebenarnya, pengalaman saya adalah bahwa terlalu sedikit orang yang akrab dengan operator ternary (atau lebih tepatnya, operator kondisional ;
?:
adalah "ternary" dalam arti yang sama yaitu||
biner atau+
unary atau binary; itu memang kebetulan hanya operator ternary dalam banyak bahasa), jadi setidaknya dalam sampel terbatas itu, pernyataan Anda gagal di sana.Juga, seperti yang disebutkan sebelumnya, ada satu situasi besar ketika operator penggabungan nol sangat berguna, dan saat itulah ekspresi yang akan dievaluasi memiliki efek samping sama sekali. Dalam hal itu, Anda tidak dapat menggunakan operator kondisional tanpa (a) memperkenalkan variabel sementara, atau (b) mengubah logika aplikasi yang sebenarnya. (B) jelas tidak sesuai dalam keadaan apa pun, dan sementara itu adalah preferensi pribadi, saya tidak suka mengacaukan ruang lingkup deklarasi dengan banyak variabel asing, bahkan jika berumur pendek, sehingga (a) terlalu dalam bahwa skenario tertentu.
Tentu saja, jika Anda perlu melakukan beberapa pemeriksaan pada hasilnya, operator bersyarat, atau serangkaian
if
blok, mungkin merupakan alat untuk pekerjaan itu. Tetapi untuk sederhana "jika ini nol, gunakan itu, kalau tidak gunakan itu", operator penggabungan nol??
sempurna.sumber
Satu hal yang banyak saya lakukan belakangan ini adalah menggunakan null coalescing untuk backup
as
. Sebagai contoh:Ini juga berguna untuk membackup rantai panjang
?.
yang masing-masing bisa gagalsumber
Satu-satunya masalah adalah operator null-coalesce tidak mendeteksi string kosong.
yaitu
KELUARAN:
Saya sedang mencari untuk mengesampingkan ?? operator untuk mengatasi ini. Ini tentu akan berguna untuk memiliki ini dibangun ke dalam Kerangka.
Pikiran?
sumber
??
tidak dapat kelebihan beban: msdn.microsoft.com/en-us/library/8edha89s(v=vs.100).aspx - itu akan menjadi hal yang bagus untuk memiliki kelebihan muatan. Saya menggunakan kombinasi: dis1.Nullify() ?? s2.Nullify()
manastring Nullify(this s)
mengembalikannull
dalam kasus ketika string kosong.Anda harus menggunakan apa yang terbaik mengekspresikan niat Anda. Karena ada adalah operator menyatu null, menggunakannya .
Di sisi lain, karena sangat khusus, saya tidak berpikir itu memiliki kegunaan lain. Saya lebih suka
||
operator yang kelebihan beban , seperti bahasa lainnya. Ini akan lebih pelit dalam desain bahasa. Tapi yah ...sumber
Keren! Anggap saya sebagai seseorang yang tidak tahu tentang operator penggabungan nol - itu hal yang sangat bagus.
Saya merasa jauh lebih mudah dibaca daripada operator ternary.
Tempat pertama yang terlintas dalam pikiran di mana saya mungkin menggunakannya adalah untuk menyimpan semua parameter default saya di satu tempat.
sumber
Sedikit kasus penggunaan yang aneh, tapi saya punya metode di mana
IDisposable
objek berpotensi dilewatkan sebagai argumen (dan karena itu dibuang oleh orang tua), tetapi juga bisa menjadi nol (dan karenanya harus dibuat dan dibuang dalam metode lokal)Untuk menggunakannya, kodenya terlihat seperti
Tetapi dengan nol bersatu menjadi jauh lebih rapi
sumber
Saya telah menggunakan seperti ini:
sumber