空聚結操作更清晰的空當檢查,這是它的主要目的。它也可以鏈接。
object a = null;
object b = null;
object c = new object();
object d = a ?? b ?? c; //d == c.
雖然該操作被限制爲null檢查,三元運算符不是。例如
bool isQuestion = true;
string question = isQuestion ? "Yes" : "No";
我認爲人們只是不知道空COALESCE運營商,因此他們使用三元運算來代替。三元,所以如果你不知道里面C#之前,C#在大多數C風格的語言存在和/或用另一種語言編程,te rnary是一個自然的選擇。如果您正在檢查null,請使用null coalesce運算符,它是爲此設計的,並且IL稍微優化(將其與if相比較)。
這裏是比較使用的每個
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;
首先的一個例子,只要看看語法空聚結,這是方式更清晰。三元組真是令人困惑。現在,讓我們看看IL
空凝聚只有
.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
三元只有
.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
如果那麼否則只有
.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是不是我的強項之一,所以也許有人可以編輯我的答案並擴展它。我將解釋我的理論,但我不想讓自己和其他人混淆。所有三個LOC的數量都相似,但並非所有IL運營商的執行時間都相同。
來源
2009-10-09 12:45:14
Bob
一個原因是脂肪酶可能不知道! – vpram86 2009-10-09 12:42:51
應該是「var res =(data!= null)?data:new data();」在你的樣本 – 2009-10-09 12:55:46
@Rubens,只是愚蠢的,不對。 – kenny 2009-10-09 14:27:47