2009-04-24 22 views
7

एक स्ट्रिंग शून्य या खाली होने पर पता लगाने की कोशिश करते समय, मेरे पास आमतौर पर पहले से ही स्ट्रिंग होती है। ,पैरामीटर के बिना कोई IsNullOrEmpty अधिभार विधि क्यों नहीं है?

String myString; 
bool test=myString.IsNullOrEmpty(); 

हालांकि, यह काम नहीं करता क्योंकि IsNullOrEmpty एक स्ट्रिंग पैरामीटर उम्मीद: यही कारण है कि मैं इस तरह के String.IsNullOrEmpty() के रूप में एक उपयोगिता समारोह की उम्मीद है पैरामीटर के बिना काम करने के लिए होता है। इसके बजाय, मुझे लिखना है:

String myString; 
bool test=String.IsNullOrEmpty(myString); 

ऐसा क्यों है? यह अनावश्यक रूप से घबराहट लगता है। निस्संदेह मैं इसके लिए अपनी विस्तार विधि आसानी से लिख सकता हूं, लेकिन यह एक बहुत ही स्पष्ट चूक की तरह लगता है, इसलिए मैं सोच रहा हूं कि इसके लिए कोई अच्छा कारण है या नहीं। मुझे विश्वास नहीं है कि इस फ़ंक्शन का पैरामीटर रहित ओवरलोड अभी माइक्रोसॉफ्ट द्वारा भुला दिया गया है।

उत्तर

27

इस विधि के आसपास लंबे समय से पहले विस्तार के तरीकों सी # में जोड़ा गया था कर दिया गया है, और विस्तार के तरीकों से पहले, इस तरह के xyz.IsNullOrEmpty() कि आप अभी भी कह सकते हैं, तो xyznull था के रूप में एक उदाहरण विधि/संपत्ति को परिभाषित करने के कोई रास्ता नहीं था।

+0

अच्छा बिंदु, हालांकि यह मुझे आश्चर्यचकित करता है कि वे अब अंतर को क्यों नहीं भरते हैं कि यह संभव होगा। –

+10

IsNullOrEmpty ऐसा लगता है कि यह वास्तव में एक संपत्ति के रूप में सबसे सुखद रूप से कार्यान्वित किया जाएगा, लेकिन दुर्भाग्य से हमारे पास विस्तार गुण नहीं हैं। – mquander

27

यदि स्ट्रिंग null होगी, तो IsNullOrEmpty() पर कॉल करने से NullReferenceException होगा।

String test = null; 

test.IsNullOrEmpty(); // Instance method causes NullReferenceException 

अब हमारे पास विस्तार विधियां हैं और हम इसे एक विस्तार विधि के साथ कार्यान्वित कर सकते हैं और अपवाद से बच सकते हैं। लेकिन सभी बातों को ध्यान में रखें कि यह केवल इसलिए काम करता है क्योंकि विस्तार विधियां स्थिर तरीकों के लिए वाक्य रचनात्मक चीनी से अधिक कुछ नहीं हैं।

public static class StringExtension 
{ 
    public static Boolean IsNullOrEmpty(this String text) 
    { 
     return String.IsNullOrEmpty(text); 
    } 
} 

इस विस्तार विधि के साथ follwing एक अपवाद

String test = null; 

test.IsNullOrEmpty(); // Extension method causes no NullReferenceException 

फेंक दिया कभी नहीं होगा, क्योंकि यह इस बात के लिए सिर्फ वाक्य-चीनी है।

StringExtension.IsNullOrEmpty(test); 
5

सी # 3.0 और विस्तार विधियों से पहले एक शून्य वस्तु पर एक विधि को कॉल करने का कोई तरीका नहीं था।

3

कारण कोई उदाहरण विधि नहीं है क्योंकि यदि स्ट्रिंग वास्तव में शून्य है, तो MyString.IsNullOrEmpty फेंक देगा।

public static class StringExtensions 
{ 
    public static bool IsNullOrEmpty(this string value) 
    { 
     return string.IsNullOrEmpty(value); 
    } 
} 

फिर, इस काम करेंगे:

test.IsNullOrEmpty(); 

लेकिन

यह पता करने के लिए कई करने के लिए इस पर विचार महत्वपूर्ण है कि

+0

यदि यह एक विस्तार विधि के रूप में लागू नहीं किया गया है, तो यही कारण है कि मैं पहली जगह पूछ रहा था। –

0

आप ऐसा में सी # 3.0 बना सकता है बुरा अभ्यास हो। ऐसा इसलिए है क्योंकि यह उपयोगकर्ता की अपेक्षाओं का उल्लंघन करता है। उस सावधानी के साथ प्रयोग करें।

+0

क्या आप थोड़ा और विस्तार कर सकते हैं कि आप इसे खराब अभ्यास के रूप में क्यों मानेंगे? मुझे इस तरह कुछ संदेह था, यही कारण है कि मैंने पहली बार सवाल पूछा, लेकिन मैं अभी भी नहीं देख सकता कि कक्षा का अंतर्ज्ञानी व्यवहार बुरा क्यों होगा, इसे कभी भी लागू नहीं किया जाए। मुझे कोई तरीका नहीं दिख रहा है कि विस्तार विधि हानिकारक हो सकती है, खासकर जब से यह केवल वाक्य रचनात्मक चीनी है। –

2

मैंने एक विस्तार विधि बनाई है - IsNothing - जो न केवल शून्य या खाली है, बल्कि केवल रिक्त स्थान की जांच करेगा।

public static bool IsNothing(this string source) 
{ 
    if (source == null || source.Length == 0) 
    { 
     return true; 
    } 
    else if (source.Trim().Length == 0) 
    { 
     return true; 
    } 
    return false; 
} 
+0

विचार के लिए धन्यवाद। – tvanfosson

+0

... और यह अभी भी मेरे यूनिट परीक्षण पास करता है !!! – tvanfosson

0

आप भी एक है कि कई मामलों में स्ट्रिंग ट्रिम हम में से ज्यादातर के रूप में रूप में अच्छी तरह से जोड़ने के लिए भी एक स्ट्रिंग नहीं करना चाहती चाहते हो सकता है आप अपने तार के परीक्षण के लिए विस्तार तरीकों या सहायक तरीकों को जोड़ने की प्रक्रिया में हैं, तो जिसमें एक टैब या रिक्त स्थान जैसे व्हाइटस्पेस है।

यहाँ हमारे परीक्षण तरीकों में से एक

सार्वजनिक स्थिर IsTrimStringNullOrEmpty bool (स्ट्रिंग मान)
{
        अगर (मूल्य == नल) सच वापसी है,
        यदि (value.Trim() == string.Empty) सत्य लौटाएं;
        झूठी वापसी;
}

या

आप मूल्य का परीक्षण करना चाहते हैं और यह एक ही समय में छंटनी की है, तो अगर NotNullOrEmpty

IsTrimStringNullOrEmpty (संदर्भ स्ट्रिंग मान) bool सार्वजनिक स्थिर
{
        अगर (मूल्य == शून्य) सत्य वापस आते हैं;
        मूल्य = मूल्य.Trim();
        अगर (value == string.Empty) सत्य लौटाएं;
        झूठी वापसी;
}

1

जबकि यह इस लक्ष्य को हासिल करने के लिए एक विस्तार विधि को परिभाषित करने के पूरी तरह से संभव है (और वैध) है, मैं चिंतित होना होगा कि यह अजीब वाक्य रचना लग रहा है, में यह प्रतीत होता है कि एक वस्तु पर एक विधि कॉल होने के लिए जो शून्य हो सकता है।

वाईएमएमवी, लेकिन मैं String.IsNullOrEmpty के साथ चिपके रहूंगा।

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