Yanıtlar:
Bu var boş koşullu operatör. Temel olarak şu anlama gelir:
"İlk işleneni değerlendirin; bu boşsa, boş, bir sonuçla durun. Aksi takdirde, ikinci işleneni (ilk işlenenin üye erişimi olarak) değerlendirin."
Örnekte, nokta eğer olmasıdır aolduğunu null, daha sonra a?.PropertyOfAdeğerlendirecek nullbir istisna atma yerine - bu o karşılaştırır nullile referans foo(dize ait kullanılarak ==aşırı), bunlar eşit değiliz bulup infaz gövdesine gidecek ifaçıklamada .
Başka bir deyişle, şöyle:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
... bunun dışında asadece bir kez değerlendirilir.
Bunun ifadenin türünü de değiştirebileceğini unutmayın. Örneğin, düşünün FileInfo.Length. Bu bir tür özelliğidir long, ancak bunu null koşullu işleçle kullanırsanız, bir tür ifadesiyle sonuçlanırsınız long?:
FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
Bir hiyerarşiyi düzleştirirken ve / veya nesneleri eşlerken çok yararlı olabilir. Onun yerine:
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;
}
Gibi yazılabilir (yukarıdaki ile aynı mantık)
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
DotNetFiddle.Net Çalışma Örneği .
( ?? veya null birleştirme operatörü ? veya null koşullu işleçten farklıdır ).
Ayrıca Action ile atama operatörlerinin dış tarafında da kullanılabilir. Onun yerine
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
Aşağıdakiler için basitleştirilebilir:
myAction?.Invoke(TValue);
Sistem kullanma;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
Sonuç:
Test 2
|| Model.Model2.Model3.Model4.Name == null dava aksi de aynı mantığı olması Model.Model2.Model3.Model4.Nameise null, mapped.Namekalacaknull
Model.Model2.Model3.Model4.Nameolduğunu null.
elseBunda -branch atlamak ve sahip mapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null, ikinci örnek yerine olurdu mapped.Name = "N/A". Bkz düzenlenmiş DotNetFiddle
Bu, yöntem zincirlemedeki null veya null olmayan değerlerle ilgili işlevleri çağırmamızı kolaylaştıran C # için nispeten yenidir .
aynı şeyi başarmanın eski yolu şuydu:
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
ve şimdi sadece daha kolay hale getirildi:
member?.someFunction(var someParam);
Burada okumanızı şiddetle tavsiye ederim: