2009-12-30 14 views
6

संभव डुप्लिकेट:
string.IsNullOrEmpty() vs string.NotNullOrEmpty()क्यों स्ट्रिंग। आईएसएनयूएलओआरएक्टी (स्ट्र) और स्ट्रिंग नहीं है ISNullOrEmpty()?

किसी ने मुझे बता सकते हैं क्यों .NET में मैं String.IsNullOrEmpty(str) बजाय str.IsNullOrEmpty() लिखना चाहते हैं? एक तार्किक कारण होना चाहिए लेकिन मुझे यह नहीं पता।

ऐसा लगता है तुम लोगों की तरह कह रहे हैं

  1. आप वस्तुओं है कि सी # में अशक्त हैं से तरीकों कॉल नहीं कर सकते /। नेट (मैं इसे सी में क्या ++, यह सिर्फ does not पहुँच किसी भी सदस्य वार्स)
  2. एक्सटेंशन तरीकों नेट में मौजूद नहीं था 2.0
  3. माइक्रोसॉफ्ट मानकों को अद्यतन करने के लिए परेशान नहीं किया और शायद लगा कि यह तुच्छ
+3

मज़ा sidenote: आप वास्तव में स्मालटाक में ऐसा कर सकते हैं, क्योंकि शून्य भी है एक ऑब्जेक्ट (यह UndefinedObject का सिंगलटन उदाहरण है)। –

+0

इस उद्देश्य के लिए एक विस्तार विधि का उपयोग करना सिर्फ सादा गलत है क्योंकि यह विस्तार विधियों के कार्यान्वयन विवरण का शोषण करता है। आप प्रभावी रूप से 'null.IsNullOrEmpty() 'को कानूनी कथन होने की अनुमति देंगे, भले ही इसे इस तरह संकलित नहीं किया गया हो। –

+0

सटीक डुप्लिकेट: http://stackoverflow.com/questions/734372 –

उत्तर

25

यदि IsNullOrEmpty एक उदाहरण विधि थी, तो इसे एक शून्य उदाहरण पर कॉल करने से एक NullReferenceException फेंक दिया जाएगा, जैसा कि आप चाहते हैं झूठी वापसी नहीं करेंगे।

यह एक विस्तार विधि हो सकता है, लेकिन फिर यह संभवतः भ्रमित हो जाएगा - यह एक उदाहरण विधि की तरह दिखता है, लेकिन एक जैसा कार्य नहीं करेगा।

+8

यह एक विस्तार विधि नहीं हो सकता है; यह सी # 3.0 से पहले अस्तित्व में था। – jason

+1

@ जेसन, मुझे लगता है कि वह क्या कह रहा है कि आप इसे संभालने के लिए एक विस्तार विधि बना सकते हैं। – kemiller2002

+3

इसके अलावा, क्या आप 'स्ट्रिंग'' के 'शून्य' उदाहरण प्राप्त करते समय 'IsNullOrEmpty' को' सत्य 'वापस नहीं करना चाहते हैं? – jason

9

तो str रिक्त है, यह किसी भी सुलभ तरीकों की ज़रूरत नहीं होगी था, क्योंकि वहाँ नहीं है एक वस्तु का एक उदाहरण। एक शून्य ऑब्जेक्ट पर एक विधि को कॉल करने का प्रयास करने के लिए आपको एक शून्य संदर्भ अपवाद मिलेगा।

स्ट्रिंग .IsNullOrEmpty स्थिर है, इसलिए यह स्ट्रिंग ऑब्जेक्ट्स का परीक्षण करने के लिए हमेशा उपलब्ध रहेगा।

मुझे लगता है कि आप बहस कर सकते हैं कि यह str.IsEmpty (जैसे जोनाथन ने कहा, तो आप इस संभाल करने के लिए स्ट्रिंग वस्तु के लिए एक extenion method कर सकता है) के लिए काम हो सकता है, लेकिन वास्तव में यह String.IsNullOrEmpty (कॉल करने के लिए बस के रूप में आसान है str) और दोनों स्थितियों को शामिल करता है। भले ही वे समान नहीं हैं, फिर भी अधिकांश लोग उन्हें समान मानते हैं (व्यवसाय तर्क के संदर्भ में और स्ट्रिंग के मानों को संभालने के दौरान एक मान स्ट्रिंग के लिए एक मान मौजूद है)।

4

IsNullOrEmptystring कक्षा पर एक स्थिर विधि है; यह एक उदाहरण विधि नहीं है। ऐसा इसलिए है क्योंकि strnull एक उदाहरण विधि को आमंत्रित करने का अर्थ नहीं है क्योंकि आपको NullReferenceException मिल जाएगा। इस प्रकार, IsNullOrEmpty एक स्थिर विधि होना चाहिए।

5

String.IsNullOrEmpty एक क्लास विधि है।

यदि str Nothing (शून्य) तो आप उस पर कोई विधि नहीं बुला सकते थे। आप केवल किसी ऑब्जेक्ट पर एक इंस्टेंस विधि कॉल कर सकते हैं।

+0

यह उल्लेख करने में मदद करता है कि यह केवल क्लास विधि न केवल इंस्टेंस क्लास का एक स्थिर तरीका है। यदि यह एक क्लास विधि थी तो वह जो भी पोस्ट करता था वह सच होता यानी: स्ट्रिंग someobject; someobject.isnullorempty(); – JonH

0

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

3

मैं थोड़ी देर के लिए एक विस्तार विधि का उपयोग कर रहा हूं। बहुत अच्छा काम करता है।

public static bool IsNullOrEmpty(this string val) 
{ 
    return string.IsNullOrEmpty(val); 
} 

यह स्पष्ट रूप से string.IsNullOrEmpty (स्ट्रिंग) के रूप में एक ही बात करता है, लेकिन ऐसा लगता है कि कुछ करने के लिए सिर्फ आसान है

if(mystring.IsNullOrEmpty()) 
{ 
    //... do something 
} 
संबंधित मुद्दे

 संबंधित मुद्दे