Visual Basic में, स्टेटमेंट के IIf
बजाय फंक्शन का उपयोग करने पर प्रदर्शन अंतर होता है If
?
Visual Basic में, स्टेटमेंट के IIf
बजाय फंक्शन का उपयोग करने पर प्रदर्शन अंतर होता है If
?
जवाबों:
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)
If
के IIf
फ़ंक्शन से अधिक कुशल है ।
That's all you need to know, really
ज्ञान साझा करने के लिए समर्पित वेबसाइट के लिए एक अनुकूल रवैया की तरह आवाज़ नहीं करता है;)
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!
इसके अलावा, आईआईएफ के साथ एक और बड़ा मुद्दा यह है कि यह वास्तव में किसी भी फ़ंक्शन को तर्क में कहेंगे [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
यदि आईएफएफ के बजाय सही प्रकार के इंफेक्शन तंत्र का उपयोग करना है तो बेहतर उपयोग करें (विकल्प का प्रयोग करें)
इस उदाहरण में, जब मैं उपयोग करता हूं तो कीवर्ड को एक स्ट्रिंग के रूप में मान्यता दी जाती है:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
अन्यथा, इसे एक वस्तु के रूप में मान्यता दी जाती है:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
इस लड़के के अनुसार , अगर / तो आईएफएफ 6x तक का समय ले सकता है। YMMV।
उस पर, इस मामले में प्रदर्शन की तुलना में पठनीयता को शायद अधिक पसंद किया जाना चाहिए। यहां तक कि अगर IIF अधिक कुशल था, तो यह लक्षित दर्शकों के लिए केवल सादा कम पठनीय है (मुझे लगता है कि यदि आप विजुअल बेसिक में काम कर रहे हैं, तो आप चाहते हैं कि अन्य प्रोग्रामर आपके कोड को आसानी से पढ़ सकें, जो VB का सबसे बड़ा वरदान है ... और जो मेरी राय में IIF जैसी अवधारणाओं के साथ खो गया है)।
इसके अलावा, "आईआईएफ एक फ़ंक्शन है, बनाम यदि भाषाओं के सिंटैक्स का हिस्सा हो रहा है ... जो कि मेरे लिए निहित है कि, वास्तव में, अगर तेजी से होगा ... अगर इसके अलावा और कुछ नहीं तो अगर स्टेटमेंट को सीधे उबला जा सकता है उक्त फ़ंक्शन में पाए गए लॉजिक को निष्पादित करने के लिए मेमोरी में किसी अन्य स्थान पर जाने के बजाय ऑपकोड का एक छोटा सा सेट। यह एक गंभीर अंतर है, शायद, लेकिन ध्यान देने योग्य है।
मेरा मानना है कि अगर और IIf के बीच मुख्य अंतर है:
यदि (परीक्षण [बूलियन], कथन 1, कथन 2) का अर्थ है कि परीक्षण मूल्य के अनुसार या तो satement1 या कथन 2 निष्पादित किया जाएगा (सिर्फ एक कथन निष्पादित करेगा)
मंद obj = IIF (परीक्षण [बूलियन], कथन 1, कथन 2) इसका मतलब है कि दोनों कथन निष्पादित करेंगे लेकिन परीक्षण मूल्य के अनुसार उनमें से एक मान (obj) को वापस कर देगा।
इसलिए यदि कोई एक बयान एक अपवाद को फेंक देगा तो वह इसे (IIf) किसी भी तरह से फेंक देगा, लेकिन (यदि) इसे सिर्फ इस स्थिति में फेंक देगा कि स्थिति अपना मूल्य वापस कर देगी।
... क्यों के रूप में यह 6x के रूप में लंबे समय तक ले जा सकते हैं, विकी को छोड़ें:
क्योंकि IIf एक लाइब्रेरी फंक्शन है, इसे हमेशा एक फंक्शन कॉल के ओवरहेड की आवश्यकता होगी, जबकि एक सशर्त ऑपरेटर अधिक इनलाइन कोड का उत्पादन करेगा।
अनिवार्य रूप से IIf C ++ / C # में एक टर्नरी ऑपरेटर के बराबर है, इसलिए यह आपको कुछ अच्छी 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()
इस तरह से उपयोग करना सिर्फ आपको कोड पढ़ने वाले लोगों को भ्रमित करने वाला है।
IIf
।