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 a
ini null
, maka a?.PropertyOfA
akan mengevaluasi ke null
daripada membuang pengecualian - kemudian akan membandingkan bahwa null
referensi dengan foo
(menggunakan string ==
yang berlebihan), menemukan mereka tidak sama dan eksekusi akan masuk ke tubuh if
pernyataan .
Dengan kata lain, seperti ini:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
... kecuali itu a
hanya 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.Name
ini null
, mapped.Name
akan tetapnull
Model.Model2.Model3.Model4.Name
ada null
.
else
cabang 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: