अशक्त सम्मिलित ऑपरेटर जब अशक्त के लिए जाँच, कि इसका मुख्य उद्देश्य है अधिक स्पष्ट है। यह भी श्रृंखलित जा सकता है।
object a = null;
object b = null;
object c = new object();
object d = a ?? b ?? c; //d == c.
कि ऑपरेटर जाँच शून्य पर सीमित है, त्रिगुट ऑपरेटर है नहीं। उदाहरण के लिए
bool isQuestion = true;
string question = isQuestion ? "Yes" : "No";
मुझे लगता है। लोग सिर्फ अशक्त सम्मिलित ऑपरेटर के बारे में पता है तो वे बजाय त्रिगुट ऑपरेटर का उपयोग नहीं कर रहे हैं, इसलिए यदि आप सी # के अंदर पता नहीं है त्रिगुट पहले सी सबसे सी शैली भाषाओं में # अस्तित्व में और बाहर और/या आप किसी अन्य भाषा में प्रोग्राम किया, ते rnary एक प्राकृतिक पसंद है। यदि आप शून्य के लिए जांच कर रहे हैं, तो नल कोलेसे ऑपरेटर का उपयोग करें, यह इसके लिए डिज़ाइन किया गया है, और आईएल थोड़ा अनुकूलित है (तुलना करें ?? अगर किसी और के लिए)।
यहाँ एक उदाहरण से प्रत्येक
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;
सबसे पहले उपयोग की तुलना है, बस अशक्त सम्मिलित वाक्य विन्यास को देखो, यह जिस तरह से स्पष्ट है। टर्नरी वास्तव में भ्रमित है। अब देता है आईएल पर देखने
अशक्त संगठित होना केवल
.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
आईएल मेरी मजबूत बिंदुओं में से एक नहीं है, तो शायद कोई मेरा जवाब संपादित कर सकता है और उस पर विस्तार कर सकता है। मैं अपने सिद्धांत की व्याख्या करने जा रहा था, लेकिन मैं खुद को और दूसरों को भ्रमित नहीं करना चाहता था। एलओसी की संख्या सभी तीनों के लिए समान है, लेकिन सभी आईएल ऑपरेटरों को निष्पादित करने के लिए समान समय नहीं लगता है।
एक कारण है कि पीपीएल को पता नहीं हो सकता है! – vpram86
"var res = (data! = Null) होना चाहिए? डेटा: नया डेटा();" आपके नमूने में –
@ रूबेन्स, बस मूर्ख और सही नहीं। – kenny