Ini adalah operator kondisional nol . Ini pada dasarnya berarti:
"Evaluasi operan pertama; jika itu nol, hentikan, dengan hasil nol. Kalau tidak, evaluasi operan kedua (sebagai akses anggota dari operan pertama)."
Dalam contoh Anda, intinya adalah bahwa jika aini null, maka a?.PropertyOfAakan mengevaluasi ke nulldaripada membuang pengecualian - kemudian akan membandingkan bahwa nullreferensi dengan foo(menggunakan string ==yang berlebihan), menemukan mereka tidak sama dan eksekusi akan masuk ke tubuh ifpernyataan .
Dengan kata lain, seperti ini:
string bar =(a ==null?null: a.PropertyOfA);if(bar != foo){...}
... kecuali itu ahanya dievaluasi sekali.
Perhatikan bahwa ini juga dapat mengubah jenis ekspresi. Sebagai contoh, pertimbangkan FileInfo.Length. Itu properti tipe long, tetapi jika Anda menggunakannya dengan operator kondisional nol, Anda berakhir dengan ekspresi tipe long?:
FileInfo fi =...;// fi could be nulllong? length = fi?.Length;// If fi is null, length will be null
@ SLaks: Saya pikir itu "conditional null" tapi saya bisa saja salah. Terakhir kali saya memeriksa dokumen fitur bahasa Roslyn, itu belum diganti namanya juga. Mungkin sumbernya adalah otoritas di sini - akan memeriksa.
Jon Skeet
3
@SLaks: Tentu. Dalam SyntaxKind itu tampaknya ConditionalAccessExpression yang tidak mengganggu mereka ...
Jon Skeet
12
Saya lebih suka nama "Elvis" operator: P
Ahmed ilyas
3
Sebagai catatan saya telah melihat lima nama berbeda untuk operator ini: navigasi yang aman, null-conditional, null propagation, conditional access, Elvis.
Gigi
81
Ini bisa sangat berguna ketika meratakan sebuah hierarki dan / atau memetakan objek. Dari pada:
Untuk menyelamatkan orang mencari apa ?? adalah .. Ini adalah operator penggabungan nol dan akan mengembalikan Nama jika bukan nol, jika tidak maka akan mengembalikan "N / A".
Steve
6
@Erik Philips Saya pikir Anda perlu menambahkan || Model.Model2.Model3.Model4.Name == null untuk memiliki logika yang sama, jika tidak, dalam kasus Model.Model2.Model3.Model4.Nameini null, mapped.Nameakan tetapnull
RazvanR
2
@ErikPhilips Tidak di halaman yang sama kurasa. Coba lihat apa yang terjadi pada kedua kasus Anda jika Model.Model2.Model3.Model4.Nameada null.
@ErikPhilips: Itu tidak ada hubungannya dengan komentar pertama, karena ini tidak berhubungan dengan contoh pertama Anda. Dalam hal ini Anda akan melompat ke- elsecabang dan miliki mapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null, sedangkan contoh kedua Anda akan menggantikan mapped.Name = "N/A". Lihat diedit DotNetFiddle
Derm
3
Ini relatif baru untuk C # yang membuatnya mudah bagi kita untuk memanggil fungsi sehubungan dengan nilai-nilai nol atau non-nol dalam metode chaining.
cara lama untuk mencapai hal yang sama adalah:
var functionCaller =this.member;if(functionCaller!=null)
functionCaller.someFunction(var someParam);
dan sekarang telah dibuat lebih mudah hanya dengan:
member?.someFunction(var someParam);
Saya sangat menyarankan Anda untuk membacanya di sini:
Ini bisa sangat berguna ketika meratakan sebuah hierarki dan / atau memetakan objek. Dari pada:
Itu dapat ditulis seperti (logika yang sama seperti di atas)
Contoh Kerja DotNetFiddle.Net .
( operator ?? atau null-coalescing berbeda dari operator kondisional? atau null ).
Itu juga dapat digunakan di luar operator penugasan dengan Action. Dari pada
Ini dapat disederhanakan untuk:
Contoh DotNetFiddle :
menggunakan Sistem;
Hasil:
sumber
|| Model.Model2.Model3.Model4.Name == null
untuk memiliki logika yang sama, jika tidak, dalam kasusModel.Model2.Model3.Model4.Name
ininull
,mapped.Name
akan tetapnull
Model.Model2.Model3.Model4.Name
adanull
.else
cabang dan milikimapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null
, sedangkan contoh kedua Anda akan menggantikanmapped.Name = "N/A"
. Lihat diedit DotNetFiddleIni relatif baru untuk C # yang membuatnya mudah bagi kita untuk memanggil fungsi sehubungan dengan nilai-nilai nol atau non-nol dalam metode chaining.
cara lama untuk mencapai hal yang sama adalah:
dan sekarang telah dibuat lebih mudah hanya dengan:
Saya sangat menyarankan Anda untuk membacanya di sini:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators
sumber