boş kaynaşabilecek operatör için null denetlerken, bu ana amacı budur çok daha nettir. Ayrıca zincirleme edilebilir. Bu operatör kontrol null sınırlı iken
object a = null;
object b = null;
object c = new object();
object d = a ?? b ?? c; //d == c.
, üçlü operatördür değil. Örneğin
bool isQuestion = true;
string question = isQuestion ? "Yes" : "No";
Onlara, bunun yerine üçlü operatörü kullanmak böylece insanlar sadece boş kaynaşabilecek operatörü farkında değildir düşünüyorum. içinizde C# bilmiyorum eğer öyleyse üçlü çoğu C tarzı dilde C# önce var ve dışarı ve/veya başka bir dilde programlanmış, te Rnary doğal bir seçimdir. Ancak null için denetliyorsanız, null coalesce işlecini kullanın, bunun için tasarlandı ve IL biraz daha iyi duruma getirildi.
İşte her
object a = null;
object b = null;
object c = null;
object nullCoalesce = a ?? b ?? c;
object ternary = a != null ? a : b != null ? b : c;
object ifThenElse;
if (a != null)
ifThenElse = a;
else if (b != null)
ifThenElse = b;
else if (c != null)
ifThenElse = c;
İlk kullanımını karşılaştıran bir örnektir, sadece boş COALESCE için sözdizimi bakmak, bu yol nettir. Üçlü gerçekten kafa karıştırıcıdır. Şimdi IL at
Boş Coalesce bakalım Sadece
.entrypoint
.maxstack 2
.locals init (
[0] object a,
[1] object b,
[2] object c,
[3] object nullCoalesce)
L_0000: ldnull
L_0001: stloc.0
L_0002: ldnull
L_0003: stloc.1
L_0004: newobj instance void [mscorlib]System.Object::.ctor()
L_0009: stloc.2
L_000a: ldloc.0
L_000b: dup
L_000c: brtrue.s L_0015
L_000e: pop
L_000f: ldloc.1
L_0010: dup
L_0011: brtrue.s L_0015
L_0013: pop
L_0014: ldloc.2
L_0015: stloc.3
L_0016: ldloc.3
L_0017: call void [mscorlib]System.Console::WriteLine(object)
L_001c: ret
Sadece
.entrypoint
.maxstack 1
.locals init (
[0] object a,
[1] object b,
[2] object c,
[3] object ifThenElse)
L_0000: ldnull
L_0001: stloc.0
L_0002: ldnull
L_0003: stloc.1
L_0004: newobj instance void [mscorlib]System.Object::.ctor()
L_0009: stloc.2
L_000a: ldloc.0
L_000b: brfalse.s L_0011
L_000d: ldloc.0
L_000e: stloc.3
L_000f: br.s L_001a
L_0011: ldloc.1
L_0012: brfalse.s L_0018
L_0014: ldloc.1
L_0015: stloc.3
L_0016: br.s L_001a
L_0018: ldloc.2
L_0019: stloc.3
L_001a: ldloc.3
L_001b: call void [mscorlib]System.Console::WriteLine(object)
L_0020: ret
IL benim güçlü noktalarından biri değil sadece
.entrypoint
.maxstack 2
.locals init (
[0] object a,
[1] object b,
[2] object c,
[3] object ternary)
L_0000: ldnull
L_0001: stloc.0
L_0002: ldnull
L_0003: stloc.1
L_0004: newobj instance void [mscorlib]System.Object::.ctor()
L_0009: stloc.2
L_000a: ldloc.0
L_000b: brtrue.s L_0016
L_000d: ldloc.1
L_000e: brtrue.s L_0013
L_0010: ldloc.2
L_0011: br.s L_0017
L_0013: ldloc.1
L_0014: br.s L_0017
L_0016: ldloc.0
L_0017: stloc.3
L_0018: ldloc.3
L_0019: call void [mscorlib]System.Console::WriteLine(object)
L_001e: ret
Sonra Else ise Üçlü, belki birisi benim cevabımı düzenleyebilir ve üzerinde genişleyebilir. Teorimi açıklayacağım ama kendimi ve başkalarını karıştırmamayı tercih ediyorum. LOC sayısı her üç için de benzerdir, ancak tüm IL operatörleri yürütmek için aynı süreyi almaz. Aklıma
bir nedeni ppl farkında olmayabilir olduğunu! – vpram86
"var res = (data! = Null)? Data: new data();" olmalıdır. Numaranızda –
@Rubens, sadece aptalca ve doğru değil. – kenny