ヌル合体演算子はnullをチェックするとき、それはその主な目的である非常に明確である。それはまた連鎖させることができます。
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";
は、私は、彼らが代わりに三項演算子を使用して、人々は単にヌル合体演算子を認識していないと思います。あなたが内部のC#を知らないので、もし三項は、ほとんどのCスタイルの言語でのC#の前に存在していましたアウトしたり、別の言語でプログラミングしたりする3次元は自然な選択です。あなたがnullをチェックしているなら、ヌル合体演算子を使用してください。それはそのために設計されています。そして、ILはわずかに最適化されています(if thenをelseと比較してください)。
はここで各
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 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が私の長所の一つではないだけ
.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
そして、そうでない場合には三元、多分誰かが私の答えを編集してそれを拡大することができます。私は自分の理論を説明しようとしていましたが、私は自分自身と他者を混同しないでください。 LOCの数は3つすべてで似ていますが、すべてのIL演算子が同じ長さの時間を実行するわけではありません。
出典
2009-10-09 12:45:14
Bob
pplは認識しない可能性があります。 – vpram86
は "var res =(data!= null)?data:new data();"にする必要があります。あなたのサンプルで –
@Rubens、ちょうど愚かではない。 – kenny