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 a
olduğunu null
, daha sonra a?.PropertyOfA
değerlendirecek null
bir istisna atma yerine - bu o karşılaştırır null
ile referans foo
(dize ait kullanılarak ==
aşırı), bunlar eşit değiliz bulup infaz gövdesine gidecek if
açıklamada .
Başka bir deyişle, şöyle:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
... bunun dışında a
sadece 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.Name
ise null
, mapped.Name
kalacaknull
Model.Model2.Model3.Model4.Name
olduğunu null
.
else
Bunda -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: