Pertanyaan Apa arti dua tanda tanya bersama dalam C #?


Berlari-lari melintasi baris kode ini:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

Apa arti dari dua tanda tanya, apakah itu semacam operator terner? Sulit untuk mencari di Google.


1319
2018-01-15 14:03


asal


Jawaban:


Ini adalah operator penggabungan nol, dan cukup seperti operator terner (langsung-jika). Lihat juga ?? Operator - MSDN.

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

meluas ke:

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

yang selanjutnya diperluas ke:

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

Dalam bahasa Inggris, itu berarti "Jika apa pun yang ada di sebelah kiri tidak nol, gunakan itu, jika tidak gunakan apa yang benar."

Perhatikan bahwa Anda dapat menggunakan sejumlah ini secara berurutan. Pernyataan berikut akan menetapkan non-null pertama Answer# untuk Answer (jika semua Jawaban adalah null maka Answer adalah null):

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

Juga perlu disebutkan sementara ekspansi di atas secara konseptual setara, hasil dari setiap ekspresi hanya dievaluasi sekali. Ini penting jika misalnya ekspresi adalah pemanggilan metode dengan efek samping. (Kredit ke @Joey untuk menunjukkan hal ini.)


1801
2018-01-15 14:04



Hanya karena tidak ada orang lain yang mengatakan kata-kata ajaib itu: 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 sebuah ekspresi. Ekspresi bentuk:

a ?? b ?? c ?? d

akan memberikan hasil ekspresi a jika tidak null, jika tidak coba b, jika tidak coba c, jika tidak coba d. Ini sirkuit pendek di setiap titik.

Juga, jika jenisnya d tidak dapat dibatalkan, jenis seluruh ekspresi juga tidak dapat ditukar.


232
2018-01-15 14:07



Ini operator penggabungan nol.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

Ya, hampir tidak mungkin untuk mencari kecuali Anda tahu apa namanya! :-)

EDIT: Dan ini adalah fitur keren dari pertanyaan lain. Anda bisa rantai mereka.

Fitur Tersembunyi C #?


64
2018-01-15 14:05



Terima kasih semuanya, berikut adalah penjelasan paling ringkas yang saya temukan di situs MSDN:

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;

21
2018-01-15 14:09



?? ada di sana untuk memberikan nilai untuk tipe nullable ketika nilainya nol. Jadi, jika formsAuth adalah null, maka akan mengembalikan FormsAuthenticationWrapper baru ().


16
2018-01-15 14:05



enter image description here

Dua tanda tanya (??) menunjukkan bahwa operator Koalescing.

Operator penggabung mengembalikan nilai NON-NULL pertama dari sebuah rantai. Anda bisa lihat video youtube ini yang menunjukkan semuanya secara praktis.

Tapi izinkan saya menambahkan lebih banyak pada apa yang dikatakan video.

Jika Anda melihat makna bahasa Inggris dari penggabungan itu mengatakan "konsolidasi bersama". Sebagai contoh di bawah ini adalah kode penggabungan sederhana yang mengikat empat string.

Jadi jika str1 aku s null itu akan mencoba str2, jika str2 aku s null itu akan mencoba str3 dan seterusnya sampai menemukan string dengan nilai bukan nol.

string final = str1 ?? str2 ?? str3 ?? str4;

Dengan kata sederhana, operator Coalescing mengembalikan nilai NON-NULL pertama dari sebuah rantai.


13
2017-12-16 10:30



Ini tangan pendek untuk operator terner.

FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();

Atau bagi mereka yang tidak melakukan terner:

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}

9
2018-01-15 14:05