Berlari melintasi baris kode ini:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
Apa arti dari dua tanda tanya, apakah itu semacam operator ternary? Sulit untuk mencari di Google.
c#
null-coalescing-operator
Edward Tanguay
sumber
sumber
Jawaban:
Ini adalah operator penggabungan nol, dan sangat mirip dengan operator ternary (langsung-jika). Lihat juga ?? Operator - MSDN .
memperluas ke:
yang selanjutnya berkembang menjadi:
Dalam bahasa Inggris, itu berarti "Jika apa pun yang ada di sebelah kiri bukan nol, gunakan itu, kalau tidak gunakan apa yang ke kanan."
Perhatikan bahwa Anda dapat menggunakan nomor-nomor ini secara berurutan. Pernyataan berikut akan menetapkan non-null pertama
Answer#
keAnswer
(jika semua Jawaban adalah nol maka ituAnswer
adalah nol):Juga perlu disebutkan sementara ekspansi di atas secara konseptual setara, hasil dari setiap ekspresi hanya dievaluasi satu kali. Ini penting jika misalnya ekspresi adalah pemanggilan metode dengan efek samping. (Kredit untuk @ Joey karena menunjukkan ini.)
sumber
??
adalah asosiatif kiri, jadia ?? b ?? c ?? d
sama dengan((a ?? b) ?? c ) ?? d
. "Operator penugasan dan operator ternary (? :) adalah asosiatif yang tepat. Semua operator biner lainnya adalah asosiatif kiri." Sumber: msdn.microsoft.com/en-us/library/ms173145.aspxHanya karena tidak ada orang lain yang mengucapkan kata-kata ajaib: itu adalah operator penggabungan nol . Ini didefinisikan dalam bagian 7.12 dari spesifikasi bahasa C # 3.0 .
Ini sangat berguna, terutama karena cara kerjanya ketika digunakan beberapa kali dalam ekspresi. Ekspresi bentuk:
akan memberikan hasil ekspresi
a
jika tidak nol, jika tidak cobab
, jika tidak cobac
, jika tidak cobad
. Ini korsleting di setiap titik.Juga, jika jenis
d
tidak dapat dibatalkan, jenis seluruh ekspresi juga tidak dapat dibatalkan.sumber
Ini operator penggabungan nol.
http://msdn.microsoft.com/en-us/library/ms173224.aspx
Ya, hampir mustahil untuk mencari kecuali Anda tahu apa namanya! :-)
EDIT: Dan ini adalah fitur keren dari pertanyaan lain. Anda bisa merantai mereka.
Fitur Tersembunyi C #?
sumber
Terima kasih semuanya, berikut adalah penjelasan paling ringkas yang saya temukan di situs MSDN:
sumber
-1
hanya sebuah dataranint
, yang tidak dapat dibatalkan).x
tipeint?
, tetapiy
tipeint
, Anda bisa menulisint y = (int)(x ?? -1)
. Ini akan diuraikanx
menjadiint
jika tidaknull
, atau ditugaskan-1
key
jikax
tidaknull
.??
ada untuk memberikan nilai untuk jenis yang dapat dibatalkan ketika nilainya nol. Jadi, jika formAuth adalah nol, itu akan mengembalikan FormsAuthenticationWrapper () yang baru.sumber
Dua tanda tanya (??) menunjukkan bahwa ini adalah operator Penggabungan.
Operator penggabungan mengembalikan nilai NON-NULL pertama dari sebuah rantai. Anda dapat melihat video youtube ini yang menunjukkan semuanya secara praktis.
Tetapi izinkan saya menambahkan lebih banyak pada apa yang dikatakan video.
Jika Anda melihat arti bahasa Inggris penggabungan itu mengatakan "konsolidasi bersama". Sebagai contoh di bawah ini adalah kode penggabungan sederhana yang menghubungkan empat string.
Jadi jika
str1
ininull
ia akan mencobastr2
, jikastr2
ininull
ia akan mencobastr3
dan seterusnya sampai menemukan string dengan nilai non-null.Dengan kata sederhana, operator Penggabungan mengembalikan nilai NON-NULL pertama dari sebuah rantai.
sumber
Ini tangan pendek untuk operator ternary.
Atau bagi mereka yang tidak melakukan ternary:
sumber
!= null
) dan yang keduaformsAuth
(setelah?
) dapat diubah; dalam bentuk penggabungan nol, keduanya secara implisit mengambil nilai yang Anda berikan.Jika Anda terbiasa dengan Ruby,
||=
sepertinya mirip dengan C #??
bagi saya. Ini beberapa Ruby:Dan di C #:
sumber
x ||= y
desugars ke sesuatu sepertix = x || y
, jadi??
sebenarnya lebih mirip dengan polos||
di Ruby.??
hanya peduli tentangnull
, sedangkan||
operator dalam Ruby, seperti dalam kebanyakan bahasa, adalah tentangnull
,false
, atau apapun yang dapat dianggap sebagai boolean dengan nilaifalse
(misalnya dalam beberapa bahasa,""
). Ini bukan hal yang baik atau buruk, hanya perbedaan.operator penggabungan
itu setara dengan
sumber
Tidak ada yang berbahaya tentang ini. Padahal, itu indah. Anda dapat menambahkan nilai default jika diinginkan, misalnya:
KODE
sumber
int? x1 = null;
Apakah itu benarx1
-x4
HARUS menjadi jenis yang dapat dibatalkan : tidak masuk akal untuk mengatakan, secara efektif, "hasilnya adalah0
jikax4
nilai yang tidak mungkin diambil" (null
). "Jenis yang dapat dihapus" di sini mencakup jenis nilai yang dapat dibatalkan dan jenis referensi, tentu saja. Ini adalah kesalahan waktu kompilasi jika satu atau lebih variabel dirantai (kecuali yang terakhir) tidak dapat dibatalkan.Seperti yang ditunjukkan dengan benar dalam berbagai jawaban yang merupakan "operator penggabungan nol" ( ?? ), yang berbicara tentang Anda mungkin juga ingin memeriksa sepupunya "Operator Bersyarat Null" ( ?. Atau ? [ ) Yang merupakan operator yang banyak kali digunakan dalam hubungannya dengan ??
Operator tidak bersyarat
Sebagai contoh:
cara lama tanpa ? dan ?? melakukan ini
yang lebih verbose dan rumit.
sumber
Hanya untuk hiburan Anda (mengetahui bahwa Anda semua adalah C # guys ;-).
Saya pikir itu berasal dari Smalltalk, di mana sudah ada selama bertahun-tahun. Di sana didefinisikan sebagai:
di Object:
di UndefinedObject (kelas alias nil):
Ada versi yang mengevaluasi (?) Dan versi yang tidak mengevaluasi (??).
Hal ini sering ditemukan dalam metode getter untuk variabel privat (contoh) malas yang diinisialisasi, yang dibiarkan nol hingga benar-benar diperlukan.
sumber
Beberapa contoh di sini tentang mendapatkan nilai menggunakan penggabungan tidak efisien.
Yang benar-benar Anda inginkan adalah:
atau
Ini mencegah objek dari diciptakan kembali setiap waktu. Alih-alih variabel pribadi yang tersisa nol dan objek baru dibuat pada setiap permintaan, ini memastikan variabel pribadi ditugaskan jika objek baru dibuat.
sumber
??
jalan pintas dievaluasi?new FormsAuthenticationWrapper();
dievaluasi jika dan hanya jika_formsAuthWrapper
nihil.catatan:
Saya telah membaca seluruh utas ini dan banyak lainnya, tetapi saya tidak dapat menemukan jawaban selengkap ini.
Dengan mana saya benar-benar mengerti "mengapa harus menggunakan ?? dan kapan harus menggunakan ?? dan bagaimana cara menggunakan ??."
Sumber:
Yayasan komunikasi Windows dilepaskan Oleh Craig McMurtry ISBN 0-672-32948-4
Jenis Nilai Nullable
Ada dua keadaan umum di mana seseorang ingin tahu apakah suatu nilai telah ditetapkan untuk sebuah instance dari tipe nilai. Yang pertama adalah ketika instance mewakili nilai dalam database. Dalam kasus seperti itu, seseorang ingin dapat memeriksa contoh untuk memastikan apakah suatu nilai memang ada dalam database. Keadaan lain, yang lebih berkaitan dengan pokok bahasan buku ini, adalah ketika instance mewakili item data yang diterima dari beberapa sumber jarak jauh. Sekali lagi, orang ingin menentukan dari contoh apakah nilai untuk item data itu diterima.
.NET Framework 2.0 menggabungkan definisi tipe generik yang menyediakan untuk kasus-kasus seperti ini di mana seseorang ingin menetapkan nol untuk turunan dari tipe nilai, dan menguji apakah nilai turunannya nol. Definisi tipe generik itu adalah System.Nullable, yang membatasi argumen tipe generik yang dapat diganti dengan T untuk tipe nilai. Contoh tipe yang dibangun dari System.Nullable dapat diberi nilai nol; memang, nilai-nilai mereka adalah null secara default. Dengan demikian, tipe yang dibangun dari System.Nullable dapat disebut sebagai tipe nilai yang dapat dibatalkan. System.Nullable memiliki properti, Value, di mana nilai yang ditetapkan untuk sebuah instance dari tipe yang dibangun darinya dapat diperoleh jika nilai instance tidak nol. Karena itu, seseorang dapat menulis:
Bahasa pemrograman C # menyediakan sintaks yang disingkat untuk mendeklarasikan tipe yang dibangun dari System.Nullable. Sintaksis itu memungkinkan seseorang untuk menyingkat:
untuk
Kompiler akan mencegah seseorang dari mencoba untuk menetapkan nilai tipe nilai nullable ke tipe nilai biasa dengan cara ini:
Ini mencegah seseorang dari melakukan hal itu karena tipe nilai nullable dapat memiliki nilai null, yang sebenarnya akan terjadi dalam kasus ini, dan nilai itu tidak dapat ditugaskan ke tipe nilai biasa. Meskipun kompiler akan mengizinkan kode ini,
Pernyataan kedua akan menyebabkan pengecualian untuk dilempar karena setiap upaya untuk mengakses properti System.Nullable.Value adalah operasi yang tidak valid jika tipe yang dibangun dari System.Nullable belum diberi nilai T yang valid, yang belum terjadi dalam hal ini. kasus.
Kesimpulan:
Salah satu cara yang tepat untuk menetapkan nilai tipe nilai nullable ke tipe nilai biasa adalah dengan menggunakan properti System.Nullable.HasValue untuk memastikan apakah nilai T yang valid telah ditetapkan ke tipe nilai nullable:
Opsi lain adalah menggunakan sintaks ini:
Dengan mana integer biasa myInteger diberi nilai integer nullable "myNullableInteger" jika yang terakhir telah diberi nilai integer yang valid; jika tidak, myInteger diberi nilai -1.
sumber
Ini adalah operator penggabungan nol yang bekerja sama dengan operator ternary.
Hal lain yang menarik untuk ini adalah, "Tipe yang dapat dibatalkan dapat berisi nilai, atau dapat ditentukan" . Jadi, jika Anda mencoba menetapkan tipe nilai nullable ke tipe nilai non-nullable Anda akan mendapatkan kesalahan waktu kompilasi.
Jadi untuk melakukan itu menggunakan ?? operator:
sumber
setara dengan
Tapi yang paling keren dari itu adalah Anda bisa memeluk mereka, seperti kata orang lain. Satu yang tidak disentuh adalah bahwa Anda benar-benar dapat menggunakannya untuk melempar pengecualian.
sumber
The
??
operator disebut operator null-penggabungan. Ini mengembalikan operan kiri jika operan tidak nol; jika tidak mengembalikan operan kanan.Setel
variable2
ke nilaivariable1
, jikavariable1
TIDAK nol; jika tidak, jikavariable1 == null
diaturvariable2
ke 100.sumber
Yang lain menggambarkannya dengan
Null Coalescing Operator
cukup baik. Bagi yang berminat, ada sintaks singkat di mana ini (pertanyaan SO):FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
setara dengan ini:
FormsAuth ??= new FormsAuthenticationWrapper();
Beberapa merasa lebih mudah dibaca dan ringkas.
sumber