I # C में बराबर


79

क्या IIfC # में एक समतुल्य है? या समान शॉर्टकट?


4
मुझे लगता है कि "शॉर्ट सर्किट" (बूलियन ऑपरेटरों के बारे में एक विशिष्ट अर्थ) के बजाय "शॉर्ट कट" का मतलब है - क्या मैं सही हूं?
ब्लोर्बर्ड

जवाबों:


120

C # में ?अन्य C- शैली भाषाओं की तरह टर्नरी ऑपरेटर है। हालांकि, यह पूरी तरह से बराबर नहीं है IIf(); दो महत्वपूर्ण अंतर हैं।

पहले अंतर को समझाने के लिए, इस IIf()कॉल के लिए गलत-भाग तर्क एक कारण बनता है DivideByZeroException, भले ही बूलियन तर्क हो True

IIf(true, 1, 1/0)

IIf()केवल एक फ़ंक्शन है, और सभी फ़ंक्शन की तरह कॉल करने से पहले सभी तर्कों का मूल्यांकन किया जाना चाहिए। एक और तरीका रखो, पारंपरिक अर्थों में शॉर्ट सर्किट नहींIIf() करता है। दूसरी ओर, यह टर्नरी अभिव्यक्ति शॉर्ट-सर्किट करता है, और इसलिए पूरी तरह से ठीक है:

(true)?1:1/0;

अन्य अंतर IIf()सुरक्षित नहीं है। यह स्वीकार करता है और प्रकार के तर्क देता है Object। त्रिगुट ऑपरेटर है प्रकार सुरक्षित। यह जानने के लिए कि यह किस प्रकार का है, इसके प्रकार का उपयोग करता है। ध्यान दें कि आप इसे बहुत आसानी से अपने स्वयं के सामान्य IIF(Of T)()कार्यान्वयन के साथ ठीक कर सकते हैं , लेकिन इस तरह से बॉक्स से बाहर नहीं है।

यदि आप वास्तव IIf()में C # में चाहते हैं , तो आपके पास यह हो सकता है:

object IIf(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart;}

या एक सामान्य / प्रकार-सुरक्षित कार्यान्वयन:

T IIf<T>(bool expression, T truePart, T falsePart) 
{return expression?truePart:falsePart;}

दूसरी ओर, यदि आप वीबी, विज़ुअल स्टूडियो 2008 में टर्नरी ऑपरेटर चाहते हैं और बाद में एक नया If() ऑपरेटर प्रदान करते हैं जो C # के टर्नेरी ऑपरेटर की तरह काम करता है। यह यह जानने के लिए कि यह किस प्रकार लौट रहा है, टाइप प्रकार का उपयोग करता है, और यह वास्तव में एक फ़ंक्शन के बजाय एक ऑपरेटर है। इसका अर्थ है कि पूर्व मूल्यांकन के भावों से कोई समस्या नहीं है, भले ही इसमें फ़ंक्शन शब्दार्थ है।


2
VB9 एक सच्चे टर्नरी ऑपरेटर का समर्थन करता है। अगर (SomeBool, MessageBox.Show ( "सही"), MessageBox.Show ( "गलत")) के रूप में यहां देखी गई: community.bartdesmet.net/blogs/bart/archive/2007/08/31/...
snarf

1
मैं अंतिम पैराग्राफ में इसका उल्लेख करता हूं, लेकिन सवाल विशेष रूप से IIf () के बारे में था।
जोएल कोएहॉर्न

61

VB.NET:

If(someBool, "true", "false")

सी#

someBool ? "true" : "false";

1
हालांकि यह सरल अभिव्यक्तियों के लिए सच है, वैकल्पिक रूपों में साइड इफेक्ट होने पर दोनों रूप बिल्कुल समान नहीं हैं। Iif (t, foo (), bar ()) foo () और bar (), दोनों को कॉल करेगा, जबकि t? फू (): बार () या तो केवल फू () या बार () कहेंगे, लेकिन दोनों नहीं। अधिक जानकारी के लिए जोएल कोएहॉर्न के इस सवाल का जवाब देखें।
ग्रेग हेविल

1
VB.NET के "If" फ़ंक्शन का उपयोग करने के लिए "IIf" के बजाय अद्यतित उत्तर दें ताकि दो कोड ब्लॉक समान हों।
केविन पैंग

13

टर्नरी ऑपरेटर

bool a = true;

string b = a ? "if_true" : "if_false";

मैं वहाँ एक टिप्पणी जोड़ूंगा कि यह स्ट्रिंग b = (a? "asdf": "dsrs") है; यानी फिर यह समझना बेहतर है कि चीज़ कैसे काम करती है, और यह देखने के लिए कि यह वास्तव में कुछ अजीब और निरर्थक नहीं है जैसे (स्ट्रिंग बी = ए)? "sdf": "sdsdf")।
बार्लॉप

10

इसके अलावा उपयोगी है coalesce ऑपरेटर ??:

VB:

Return Iif( s IsNot Nothing, s, "My Default Value" )

सी#:

return s ?? "My Default Value";



0

यह सीमित है कि आप वहां बयान नहीं दे सकते। आप केवल मान (या वे चीजें जो लौटा सकते हैं / मूल्यों का मूल्यांकन कर सकते हैं), वापस लौटने के लिए

यह काम करता है ('ए' वर्ग ब्ला के भीतर एक स्थिर इंट है)

Blah.a=Blah.a<5?1:8;

(गोल कोष्ठक स्पष्ट रूप से बराबर और प्रश्न चिह्न के बीच होते हैं)।

यह काम नहीं करता है।

Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er");
or
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");

तो आप केवल रिटर्न मानों के लिए c # ternary ऑपरेटर का उपयोग कर सकते हैं। तो यह काफी अगर की एक छोटा रूप की तरह नहीं है। जावास्क्रिप्ट और शायद कुछ अन्य भाषाएं आपको वहाँ वक्तव्य देती हैं।


हां, क्योंकि यह एक विधि सेट कर रहा है, न कि किसी विधि को लागू करने के लिए। Actionहालांकि आप जो चाहते हैं वह करने के लिए उपयोग कर सकते हैं ।
कीरन फुट

@KieranFoot WriteLine एक विधि है। थोड़ी देर के लिए है, लेकिन अगर iifया त्रैमासिक ऑपरेटर, आप वहाँ एक वापसी मान डालते हैं जैसे Blah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2; कि अगर यह अनुमति देता है कि, यह काम करेगा, लेकिन जाहिर है यह नहीं है। और हाँ, यह अभी भी एक मूल्य निर्धारित कर रहा है, और नहीं यह कोई नई विधि नहीं कह रहा है।
बारलोप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.