Jawaban:
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 null
long? length = fi?.Length; // If fi is null, length will be null
Ini bisa sangat berguna ketika meratakan sebuah hierarki dan / atau memetakan objek. Dari pada:
if (Model.Model2 == null
|| Model.Model2.Model3 == null
|| Model.Model2.Model3.Model4 == null
|| Model.Model2.Model3.Model4.Name == null)
{
mapped.Name = "N/A"
}
else
{
mapped.Name = Model.Model2.Model3.Model4.Name;
}
Itu dapat ditulis seperti (logika yang sama seperti di atas)
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
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
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
Ini dapat disederhanakan untuk:
myAction?.Invoke(TValue);
menggunakan Sistem;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
Hasil:
Tes 2
|| Model.Model2.Model3.Model4.Name == null untuk memiliki logika yang sama, jika tidak, dalam kasus Model.Model2.Model3.Model4.Nameini null, mapped.Nameakan tetapnull
Model.Model2.Model3.Model4.Nameada null.
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
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: