IIf () और यदि के बीच प्रदर्शन अंतर


जवाबों:


140

VB में निम्नलिखित Ifकथन है जो प्रश्न को संदर्भित करता है, मुझे लगता है:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

पहला मूल रूप से C # का टर्नरी कंडिशनर ऑपरेटर है और दूसरा इसका कोलेसस ऑपरेटर है ( resultजब तक यह वापस नहीं आ जाता है Nothing, जिसमें रिटर्न होता है "Alternative")। Ifइस प्रकार बदल दिया है IIfऔर बाद अप्रचलित है।

जैसे C #, VB के सशर्त Ifऑपरेटर शॉर्ट-सर्किट, इसलिए अब आप सुरक्षित रूप से निम्नलिखित लिख सकते हैं, जो IIfफ़ंक्शन का उपयोग करना संभव नहीं है :

Dim len = If(text Is Nothing, 0, text.Length)

2
आपने प्रदर्शन प्रश्न का उत्तर नहीं दिया और इसके दुष्प्रभावों का भी उल्लेख नहीं किया IIf
जोर

2
@jor मेरे उत्तर का अंतिम पैराग्राफ दुष्प्रभाव के बारे में है। प्रदर्शन वास्तव में प्रासंगिक नहीं है जब विकल्पों में से एक अप्रचलित हो। इसके लायक होने के लिए, देशी ऑपरेटर अब तक Ifके IIfफ़ंक्शन से अधिक कुशल है ।
कोनराड रुडोल्फ

2
@mmcrae यह सही है और उद्देश्य पर: जैसा कि मैंने कहा है, IIf अप्रचलित है, इसलिए इस पर चर्चा करने में बहुत कम समझ है। उस ने कहा, मेरा अंतिम पैराग्राफ प्रासंगिक अंतर पर चर्चा करता है। वास्तव में आपको बस इतना ही पता होना चाहिए।
कोनराड रुडोल्फ

2
मैं सराहना करता हूं कि आप अच्छे मानकों का समर्थन करना चाहते हैं और यह सुनिश्चित करना चाहते हैं कि नए लोग बुरी प्रथाओं को न उठाएं, लेकिन किसी के पास पूरी तरह से वैध मुद्दा हो सकता है जिसके कारण वे अंतर को बेहतर ढंग से समझना चाहते हैं ... जैसे कि विरासत कोड को बनाए रखना, के साथ अटक जाना। कुछ अन्य उपकरण जो इसका उपयोग करते हैं, आदि और That's all you need to know, reallyज्ञान साझा करने के लिए समर्पित वेबसाइट के लिए एक अनुकूल रवैया की तरह आवाज़ नहीं करता है;)
डॉन चेडल

1
@mmcrae ओह, मेरा मतलब बर्खास्तगी से नहीं था, मेरा सिर्फ इतना मतलब था कि IIf के इंटर्नल बोरिंग तुच्छ हैं। इसमें बस एक पारंपरिक इफ स्टेटमेंट होता है, जिसका अर्थ है कि मेरे उत्तर का आखिरी टुकड़ा कोड नहीं चलेगा।
कोनराड रुडोल्फ

65

IIf()सही और गलत दोनों कोड चलाता है। संख्यात्मक असाइनमेंट जैसी सरल चीजों के लिए, यह कोई बड़ी बात नहीं है। लेकिन उस कोड के लिए जिसे किसी भी प्रकार के प्रसंस्करण की आवश्यकता होती है, आप उस स्थिति को चलाने वाले चक्र को बर्बाद कर रहे हैं जो मेल नहीं खाता है, और संभवतः साइड इफेक्ट का कारण बन सकता है।

कोड चित्रण:

Module Module1
    Sub Main()
        Dim test As Boolean = False
        Dim result As String = IIf(test, Foo(), Bar())
    End Sub

    Public Function Foo() As String
        Console.WriteLine("Foo!")
        Return "Foo"
    End Function

    Public Function Bar() As String
        Console.WriteLine("Bar!")
        Return "Bar"
    End Function
End Module

आउटपुट:

Foo!
Bar!

13

इसके अलावा, आईआईएफ के साथ एक और बड़ा मुद्दा यह है कि यह वास्तव में किसी भी फ़ंक्शन को तर्क में कहेंगे [1], इसलिए यदि आपके पास निम्न जैसी स्थिति है:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

यह वास्तव में एक अपवाद को फेंक देगा, जो यह नहीं है कि ज्यादातर लोग सोचते हैं कि फ़ंक्शन पहली बार काम करता है कि वे इसे देखते हैं। यह भी एक आवेदन में कीड़े को ठीक करने के लिए कुछ बहुत मुश्किल हो सकता है।

[१] IIf फ़ंक्शन - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx


यही कारण है कि यदि पुराने IIF को बदलने के लिए आया था, तो मुझे IIF के साथ समस्याएँ आती थीं, लेकिन IF को कोड की कई पंक्तियों को जोड़ने से बचाया जाता था।
NiL

7

यदि आईएफएफ के बजाय सही प्रकार के इंफेक्शन तंत्र का उपयोग करना है तो बेहतर उपयोग करें (विकल्प का प्रयोग करें)

इस उदाहरण में, जब मैं उपयोग करता हूं तो कीवर्ड को एक स्ट्रिंग के रूप में मान्यता दी जाती है:

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

अन्यथा, इसे एक वस्तु के रूप में मान्यता दी जाती है:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)


6

उस पर, इस मामले में प्रदर्शन की तुलना में पठनीयता को शायद अधिक पसंद किया जाना चाहिए। यहां तक ​​कि अगर IIF अधिक कुशल था, तो यह लक्षित दर्शकों के लिए केवल सादा कम पठनीय है (मुझे लगता है कि यदि आप विजुअल बेसिक में काम कर रहे हैं, तो आप चाहते हैं कि अन्य प्रोग्रामर आपके कोड को आसानी से पढ़ सकें, जो VB का सबसे बड़ा वरदान है ... और जो मेरी राय में IIF जैसी अवधारणाओं के साथ खो गया है)।

इसके अलावा, "आईआईएफ एक फ़ंक्शन है, बनाम यदि भाषाओं के सिंटैक्स का हिस्सा हो रहा है ... जो कि मेरे लिए निहित है कि, वास्तव में, अगर तेजी से होगा ... अगर इसके अलावा और कुछ नहीं तो अगर स्टेटमेंट को सीधे उबला जा सकता है उक्त फ़ंक्शन में पाए गए लॉजिक को निष्पादित करने के लिए मेमोरी में किसी अन्य स्थान पर जाने के बजाय ऑपकोड का एक छोटा सा सेट। यह एक गंभीर अंतर है, शायद, लेकिन ध्यान देने योग्य है।


6

मेरा मानना ​​है कि अगर और IIf के बीच मुख्य अंतर है:

  • यदि (परीक्षण [बूलियन], कथन 1, कथन 2) का अर्थ है कि परीक्षण मूल्य के अनुसार या तो satement1 या कथन 2 निष्पादित किया जाएगा (सिर्फ एक कथन निष्पादित करेगा)

  • मंद obj = IIF (परीक्षण [बूलियन], कथन 1, कथन 2) इसका मतलब है कि दोनों कथन निष्पादित करेंगे लेकिन परीक्षण मूल्य के अनुसार उनमें से एक मान (obj) को वापस कर देगा।

इसलिए यदि कोई एक बयान एक अपवाद को फेंक देगा तो वह इसे (IIf) किसी भी तरह से फेंक देगा, लेकिन (यदि) इसे सिर्फ इस स्थिति में फेंक देगा कि स्थिति अपना मूल्य वापस कर देगी।


5

... क्यों के रूप में यह 6x के रूप में लंबे समय तक ले जा सकते हैं, विकी को छोड़ें:

क्योंकि IIf एक लाइब्रेरी फंक्शन है, इसे हमेशा एक फंक्शन कॉल के ओवरहेड की आवश्यकता होगी, जबकि एक सशर्त ऑपरेटर अधिक इनलाइन कोड का उत्पादन करेगा।

अनिवार्य रूप से IIf C ++ / C # में एक टर्नरी ऑपरेटर के बराबर है, इसलिए यह आपको कुछ अच्छी 1 पंक्ति देता है यदि आप इसे पसंद करते हैं, तो अन्य प्रकार के कथन। आप चाहें तो मूल्यांकन करने के लिए इसे एक फ़ंक्शन भी दे सकते हैं।


1

वे कार्य अलग हैं! शायद आपको केवल IF कथन का उपयोग करने की आवश्यकता है। आईआईएफ हमेशा धीमा रहेगा, क्योंकि यह दोनों कार्य करेगा और साथ ही यह मानक IF स्टेटमेंट करेगा।

यदि आप सोच रहे हैं कि IIF फ़ंक्शन क्यों है, तो शायद यह स्पष्टीकरण होगा:

Sub main()
    counter = 0
    bln = True
    s = iif(bln, f1, f2)
End Sub

Function f1 As String
    counter = counter + 1
    Return "YES"
End Function

Function f2 As String
    counter = counter + 1
    Return "NO"
End Function

तो इसके बाद काउंटर 2 होगा, लेकिन एस केवल "हाँ" होगा। मुझे पता है कि यह काउंटर सामान बेकार है, लेकिन कभी-कभी ऐसे फ़ंक्शन होते हैं जिन्हें चलाने के लिए आपको दोनों की आवश्यकता होगी, इससे कोई फर्क नहीं पड़ता कि क्या IF सही है या गलत है, और बस उनमें से एक से अपने वैरिएबल पर मान असाइन करें।


यदि आपको दोनों को चलाने की आवश्यकता है, तो आपको स्पष्ट रूप से उन दोनों को कॉल करना चाहिए और फिर एक मानक करना चाहिए। IIf()इस तरह से उपयोग करना सिर्फ आपको कोड पढ़ने वाले लोगों को भ्रमित करने वाला है।
926 में स्पाइवोनियस

मुझे पता है कि, लेकिन सवाल उन दोनों के बीच अंतर के बारे में है।
टाइटन'

मुझे टिप्पणी के लिए आलोचना के रूप में आने का मतलब नहीं था; मैं सिर्फ इशारा कर रहा था कि इस तरह से इसका इस्तेमाल करना अच्छा अभ्यास नहीं है।
स्पिवियॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.