IsNothing बनाम कुछ भी नहीं है


130

क्या कोई यहां VB.NET का उपयोग करता है और इसके IsNothingविपरीत Is Nothing(उदाहरण के लिए, If IsNothing(anObject)या If anObject Is Nothing...) के रूप में उपयोग करने के लिए एक मजबूत प्राथमिकता है ? यदि हां, तो क्यों?

संपादित करें: यदि आपको लगता है कि वे दोनों समान रूप से स्वीकार्य हैं, तो क्या आपको लगता है कि एक को चुनना और उसके साथ रहना सबसे अच्छा है, या क्या उन्हें मिश्रण करना ठीक है?


3
कर रहे हैं एक बहुत अच्छे कारणों के का उपयोग कर से बचने के लिएIsNothing()
KyleMit

@JesseChisholm, वहाँ एक भी टिप्पणी के लिए बहुत ज्यादा है, लेकिन मेरी पिछली टिप्पणी एक लेख जिसमें 5 अलग अलग लोगों को विश्लेषण करता है के लिए इस लिंक पोस्ट blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

तकनीक के उत्तर वास्तव में दिलचस्प हैं, लेकिन शर्म की बात है कि सवाल थोड़ा बहुत खुला रह गया था और बिना किसी उपयोग के कुछ जवाब उत्पन्न किए, बस तेजी से अस्पष्ट निजी प्राथमिकता
अंडरस्कोर_ड

जवाबों:


125

यदि आप MSIL पर एक नज़र डालते हैं क्योंकि इसे निष्पादित किया जा रहा है, तो आप देखेंगे कि यह ठीक उसी कोड के लिए संकलन नहीं करता है। जब आप IsNothing () का उपयोग करते हैं तो यह वास्तव में उस पद्धति के लिए एक कॉल करता है जैसा कि अभिव्यक्ति का मूल्यांकन करने के लिए किया जाता है।

जब मैं "इज़ नथिंग" का उपयोग करने की ओर झुकाव करूंगा तो इसका कारण यह है कि मैं इसे "नॉट इज़ नोइंग" (वस्तु) के बजाय "इस्नोथ नथिंग" बना रहा हूँ, जो मुझे व्यक्तिगत रूप से अधिक पठनीय लगता है।


46

मुझे लगता है कि पैट्रिक स्टील ने अपने ब्लॉग पर इस सवाल का सबसे अच्छा जवाब दिया: ईज़िंग इज़ नोइंग ()

मैंने यहां उनके किसी भी उत्तर की नकल नहीं की, यह सुनिश्चित करने के लिए कि पैट्रिक स्टील को अपने पद का श्रेय दिया जाए। लेकिन मुझे लगता है कि अगर आप यह तय करने की कोशिश कर रहे हैं कि क्या कुछ भी नहीं है या आप का उपयोग नहीं करना चाहिए, तो आपको उनकी पोस्ट को पढ़ना चाहिए। मुझे लगता है कि आप सहमत होंगे कि कुछ भी नहीं सबसे अच्छा विकल्प है।

संपादित करें - वोटकॉफ़ की टिप्पणी यहां

आंशिक लेख सामग्री: अधिक कोड की समीक्षा करने के बाद मुझे एक और कारण पता चला जिससे आपको इससे बचना चाहिए: यह मान प्रकारों को स्वीकार करता है! जाहिर है, चूंकि IsNothing () एक ऐसा फ़ंक्शन है जो एक 'ऑब्जेक्ट' को स्वीकार करता है, आप जो कुछ भी चाहते हैं उसे पास कर सकते हैं। यदि यह एक मूल्य प्रकार है, तो .NET इसे एक वस्तु में बॉक्स कर देगा और इसे IsNothing को पास कर देगा - जो हमेशा एक बॉक्सिंग मूल्य पर गलत वापस आएगा! VB.NET कंपाइलर "Isइसन नथिंग" स्टाइल सिंटैक्स की जाँच करेगा और यदि आप एक वैल्यू टाइप पर "कुछ नहीं" करने का प्रयास करते हैं तो कंपाइल नहीं करेंगे। लेकिन IsNothing () फ़ंक्शन शिकायतों के बिना संकलित करता है। -पटेल - वोटकॉफी


7
आंशिक लेख सामग्री: अधिक कोड की समीक्षा करने के बाद मुझे एक और कारण पता चला जिससे आपको इससे बचना चाहिए: यह मान प्रकारों को स्वीकार करता है! जाहिर है, चूंकि IsNothing () एक ऐसा फ़ंक्शन है जो एक 'ऑब्जेक्ट' को स्वीकार करता है, आप जो कुछ भी चाहते हैं उसे पास कर सकते हैं। यदि यह एक मूल्य प्रकार है, तो .NET इसे एक वस्तु में बॉक्स कर देगा और इसे IsNothing को पास कर देगा - जो हमेशा एक बॉक्सिंग मूल्य पर गलत वापस आएगा! VB.NET कंपाइलर "Isइसन नथिंग" स्टाइल सिंटैक्स की जाँच करेगा और यदि आप एक वैल्यू टाइप पर "कुछ नहीं" करने का प्रयास करते हैं तो कंपाइल नहीं करेंगे। लेकिन IsNothing () फ़ंक्शन शिकायतों के बिना संकलित करता है। -पटेल
वोट कॉफ़ी

7
कुछ सामग्रियों को पोस्ट किया है जैसा कि आप कभी नहीं जानते हैं कि क्या लिंक मृत हो जाएगा और मुझे लगा कि इसने एक अच्छा बिंदु जोड़ दिया।
वोट कॉफ़ी

33

आपको पूरी तरह से उपयोग करने से बचना चाहिए IsNothing()

यहाँ IsNothing () VS कुछ भी नहीं है लेख से 4 कारण हैं

  1. सबसे महत्वपूर्ण बात, IsNothing(object)सब कुछ एक वस्तु के रूप में पारित कर दिया है, यहां तक ​​कि मूल्य प्रकार! चूंकि मूल्य प्रकार नहीं हो सकते हैं Nothing, यह पूरी तरह से बर्बाद हो गया चेक है।
    निम्नलिखित उदाहरण लें:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If

    यह संकलन और ठीक चलेगा, जबकि यह:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If

    संकलित नहीं करेगा, इसके बजाय संकलक त्रुटि उठाएगा:

    'इज़' ऑपरेटर 'इंटेगर' प्रकार के ऑपरेंड को स्वीकार नहीं करता है।
    संचालन संदर्भ या अशक्त प्रकार होना चाहिए।

  2. IsNothing(object)वास्तव में का हिस्सा है Microsoft.VisualBasic.dll
    यह अवांछनीय है क्योंकि आपके पास VisualBasic लाइब्रेरी पर एक अनावश्यक निर्भरता है।

  3. इसकी धीमी गति - वास्तव में 33.76% धीमी (1000000000 से अधिक पुनरावृत्तियों)!

  4. शायद व्यक्तिगत पसंद, लेकिन IsNothing()एक योदा शर्त की तरह पढ़ता है । जब आप एक चर को देखते हैं, तो आप इसकी जाँच कर रहे हैं, यह आपकी जाँच के विषय के रूप में है।

    यानी यह एक्स करता है ? --- नहीं है xकी एक संपत्ति ing यह ?

    इसलिए मुझे लगता If a IsNot Nothingहै कि पढ़ने से बेहतर हैIf Not IsNothing(a)


29

मैं "इज नथिंग" से सहमत हूं। जैसा कि ऊपर कहा गया है, "इसनॉट नथिंग" के साथ नकारात्मक करना आसान है।

मुझे यह पढ़ना आसान लगता है ...

If printDialog IsNot Nothing Then
    'blah
End If

उसके बाद यह...

If Not obj Is Nothing Then
    'blah
End If

5

वीबी ऐसी चीजों से भरा है जो इसे "अंग्रेजी की तरह" दोनों बनाने की कोशिश कर रहे हैं और उन लोगों के लिए आरामदायक हैं जो उपयोग की जाने वाली भाषाओं के लिए उपयोग किए जाते हैं () और {} बहुत कुछ। उदाहरण के लिए, "लाइक इंग्लिश" साइड पर ... VB में " Ain't " कीवर्ड है ... और नहीं, मैं मजाक नहीं कर रहा हूं। और दूसरी तरफ, जैसा कि आप पहले से ही जानते हैं कि यदि आप चाहते हैं तो फ़ंक्शन कॉल के साथ आप () का उपयोग कर सकते हैं, लेकिन ऐसा नहीं करना चाहिए।

मैं IsNothing () पसंद करता हूं ... लेकिन मैं C और C # का उपयोग करता हूं, इसलिए बस यही सहज है। और मुझे लगता है कि यह अधिक पठनीय है। लेकिन जो भी आपके लिए अधिक आरामदायक महसूस हो, उसके साथ जाएं।


3
आपका लिंक मर चुका है, तो इसके लायक क्या है यहाँ एक जीवित है: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08// इस बात को ध्यान में रखते हुए कि यह लोकप्रिय धारणा के विपरीत है सच नहीं।
मैट विलको

5

मैं "इज़ नथिंग" विकल्प की ओर झुक रहा हूं, मुख्यतः क्योंकि यह अधिक ओओ लगता है।

निश्चित रूप से विज़ुअल बेसिक को Ain't कीवर्ड नहीं मिला है।


क्या VB.NET एक्सटेंशन के तरीके कर सकता है? :)
klkitchens

2

मैं भी कुछ भी नहीं का उपयोग करने के लिए आंशिक रूप से उपयोग कर रहा हूँ के रूप में ज्यादा के रूप में मैं SQL में करते हैं।


1

मैंने शुरू में IsNothing का उपयोग किया था, लेकिन मैं नए प्रोजेक्ट्स में कुछ भी नहीं, मुख्य रूप से पठनीयता के लिए उपयोग करने की ओर बढ़ रहा हूं। केवल एक बार जब मैं IsNothing के साथ रहता हूं तो अगर मैं कोड का रखरखाव कर रहा हूं जहां इसका उपयोग किया जाता है और मैं लगातार रहना चाहता हूं।


-2

कुछ भी नहीं के लिए एक वस्तु की आवश्यकता होती है जिसे मूल्य कुछ भी नहीं सौंपा गया है। IsNothing () किसी भी वैरिएबल को ले सकता है जिसे संख्यात्मक प्रकार सहित आरंभिक नहीं किया गया है। यह उदाहरण के लिए उपयोगी है जब परीक्षण किया जाता है यदि एक वैकल्पिक पैरामीटर पारित किया गया है।


ये गलत है। क्या आप वाकई इसे गलत तरीके से गोल नहीं कर रहे हैं? " IsNothing का संदर्भ प्रकारों पर काम करने का इरादा है। एक मान प्रकार कुछ नहीं का मान नहीं रख सकता है और यदि आप कुछ भी नहीं असाइन करते हैं तो इसके डिफ़ॉल्ट मान का सम्मान करता है [...] IsNothing हमेशा गलत रिटर्न देता है ।" लेकिन "किसी भी डेटा प्रकार के डिफ़ॉल्ट मान का प्रतिनिधित्व करता है। [...] मूल्य प्रकारों के लिए, [यह] इस पर निर्भर करता है कि मूल्य प्रकार अशक्त है या नहीं।" तो बेहतर नहीं है? Nothing Is Nothing
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.