Pertimbangkan skenario khas berikut:
if(myObject == null) {
myObject = new myClass();
}
Saya ingin tahu apa yang dipikirkan tentang penggantian berikut ini menggunakan operator null-coalescing:
myObject = myObject ?? new myClass();
Saya tidak yakin apakah saya harus menggunakan formulir kedua. Sepertinya steno yang bagus, tetapi myObject = myObject
konstruk di awal sepertinya seperti sedikit bau kode.
Apakah ini hal yang masuk akal untuk dilakukan, atau adakah steno yang lebih baik yang saya lewatkan? Atau mungkin, "Ini tiga baris, lupakan saja!"?
Sunting: Seperti telah disebutkan, mungkin menyebut ini skenario khas adalah sesuatu yang berlebihan. Saya biasanya menemukan bahwa saya menghadapi situasi ini ketika saya mengambil entitas dari database yang memiliki properti tipe referensi anak yang mungkin belum atau belum diisi:
myClass myObject = myClassService.getById(id);
myObject.myChildObject = myObject.myChildObject ?? new myChildClass();
MyClass
harus memberikanpublic static readonly
anggotaEmpty
nilai dari jenisnya. LihatString.Empty
di MSDN .??=
operator?Jawaban:
Saya menggunakan operator penggabungan nol sepanjang waktu. Saya suka keringkasannya.
Saya menemukan operator ini memiliki sifat yang mirip dengan operator ternary (A? B: C). Dibutuhkan sedikit latihan sebelum membaca itu adalah sifat kedua, tetapi begitu Anda terbiasa, saya merasa keterbacaan meningkat dari versi lama.
Juga, situasi yang Anda gambarkan hanyalah satu skenario di mana operator berguna. Juga berguna untuk mengganti konstruksi seperti ini:
atau
dengan
sumber
myObject = myObject2 ?? myObject3
. Yang saya ingin tahu secara spesifik adalah menggunakan operator untuk mengatur objek ke dirinya sendiri kecuali itu nol.null
sebagai perbandingan.Ini
?? operator
disebut operator penggabungan nol dan digunakan untuk menentukan nilai default untuk tipe nilai yang dapat dibatalkan atau tipe referensi. Ini mengembalikan operan kiri jika operan tidak nol; jika tidak mengembalikan operan yang tepat.myObject = myObject ?? new myObject();
-instantiate default value of object
Lebih detail dan contoh kode tentang operator penggabungan nol - artikel MSDN .
Jika Anda memeriksa
more than nullable
kondisinya, sebagai alternatif Anda dapat menggunakan operator Ternary.Operator ternary
Anda juga dapat melihat ?: Operator . Ini disebut operator ternary atau kondisional . Operator kondisional (? :) mengembalikan satu dari dua nilai tergantung pada nilai ekspresi Boolean.
Contoh kode dari MSDN -?: Operator (Referensi C #) :
sumber
myObject = (myObject == null) ? new myClass() : myObject
. Jadi, kecuali saya kehilangan penggunaan yang lebih baik dari operator kondisional, tampaknya memiliki "masalah" yang sama dengan menetapkan objek ke dirinya sendiri (jika tidak nol) sebagai operator penggabungan null - dan kurang ringkas.Saya tidak berpikir bahwa skenario itu (atau paling tidak seharusnya) tipikal.
Jika Anda ingin nilai default beberapa bidang tidak menjadi
null
, maka setel di penginisialisasi bidang:Atau, jika inisialisasi lebih rumit, atur di konstruktor.
Jika Anda ingin membuat
myClass
hanya ketika Anda benar-benar membutuhkannya (mis. Karena membuatnya membutuhkan waktu lama), maka Anda dapat menggunakanLazy<T>
:(Ini memanggil konstruktor default. Jika inisialisasi lebih rumit, berikan lambda yang membuat
myClass
keLazy<T>
konstruktor.)Untuk mengakses nilai, gunakan
myObject.Value
, yang akan memanggil inisialisasi jika ini adalah pertama kalinya Anda mengaksesmyObject.Value
.sumber
Saya terutama suka menggunakan
??
dalam hubungannya dengan parameter metode opsional. Saya membatasi kebutuhan untuk kelebihan dan memastikan benda itu memiliki nilai.sumber