2009-07-10 15 views
17

मैं नहीं जानता कि कितने अनगिनत बार मैं स्ट्रिंग तर्क मान्य करने के लिए कोड लिखने के लिए मिला है:सी #: तर्क सत्यापन: अशक्त/खाली स्ट्रिंग

public RoomName(string name) 
{ 
    if (string.IsNullOrEmpty(name)) 
    { 
     throw new ArgumentException("Cannot be empty", "name"); 
    } 
} 

वहाँ वैसे भी है इस से बचने के लिए? क्या इससे बचने के लिए कुछ विशेषता या डिज़ाइन-बाय-कॉन्ट्रैक्ट तंत्र है? क्या कहने का कोई तरीका नहीं है:

public RoomName(NotNullOrEmptyString name) 
{ 

वास्तव में उस प्रकार को बनाने के बिना?

+0

आपको यह लिंक [गुणों और विधि अवरोध का उपयोग करके तर्क सत्यापन] (http://www.codinginstinct.com/2008/05/argument- सत्यापन-उपयोग-attributes.html) उपयोगी – Joe

उत्तर

0

कोड अनुबंधों के बारे में अधिक जानकारी के लिए C#: How to Implement and use a NotNull and CanBeNull attribute देखें, आज उन्हें वीएस -2008 में कैसे कार्यान्वित किया जा सकता है, और उन्हें वीएस -2010 में कैसे एकीकृत किया जाएगा।

7

आप गुणों के साथ कोड इंजेक्शन के माध्यम से ऐसा कर सकते हैं।

कुछ कोडिंग समय बचाने के लिए एक और विकल्प है, लेकिन फिर भी आपको बहुत अधिक नियंत्रण मिलता है, CuttingEdge.Conditions जैसे कुछ का उपयोग करना होगा। यह तर्क की जाँच के लिए एक धाराप्रवाह इंटरफेस प्रदान करता है, तो आप लिख सकते हैं:

name.Requires().IsNotNull(); 
1

हालांकि सवाल थोड़ी देर पहले उत्तर दिया गया है, मैं हाल ही में एक ही समस्या के बारे में सोच की है। औपचारिक कोड अनुबंध (स्वचालित सत्यापन या चेक के साथ) एक अच्छा विचार प्रतीत होता है, लेकिन आम तौर पर, उनकी सत्यापन क्षमता काफी सीमित होती है, और सरल चेक जैसे शून्य या खाली-स्ट्रिंग जांच के लिए, उन्हें केवल उतना ही कोड (या अधिक) पुराने ढंग से चेक की तुलना में।

:

विडंबना यह है कि स्ट्रिंग-मामले के लिए मेरी राय में सर्वश्रेष्ठ उत्तर वास्तव में एक या दो वर्गों है कि एक स्ट्रिंग है, अशक्त खाली या सफेद स्थान नहीं होने की जाँच की गई है लपेट, और इस उदाहरण के आसपास पारित है

public class NonEmptyString : IComparable<NonEmptyString>, ... 
{ 
    private readonly string _value; 

    public NonEmptyString(string value) 
    { 
     if (value == null) 
     { 
      throw new ArgumentNullException("value"); 
     } 
     if (value.Length == 0) 
     {     
      throw NewStringIsEmptyException("value"); 
     } 
     _value = value; 
    } 

    public string Value 
    { 
     get { return _value; } 
    } 

    ... 
} 

public class NonWhiteSpaceString : NonEmptyString 
{ 
    .... 
} 

ज़रूर, इन उदाहरणों के आसपास गुजर आप अगर वे खुद को शून्य कर रहे हैं की जाँच करने के होने से नहीं रोकता है, लेकिन यह कुछ बड़ा लाभ मिला है:

  • आप खाली या सफेद पर जांच करने की जरूरत नहीं है अंतरिक्ष स्ट्रिंग बार-बार, जो स्ट्रिंग में स्थितियों में त्रुटि प्रवण हो सकती है बहुत पास हो गया है।
  • जैसा कि मैंने अपने कार्यान्वयन में किया है, शून्य के लिए जांच एक खाली मूल्य (या व्हाइटस्पेस मान) की जांच करने से कुछ अलग है, क्योंकि आप पहले मामले में एक विशिष्ट ArgumentNullException फेंकना चाहते हैं, और दूसरे में कुछ ArgumentException फेंकना चाहते हैं।
  • यह स्पष्ट रूप से स्ट्रिंग के मूल्य पर बाधा को इंगित करता है, जैसे किसी भी रैपिंग क्लास को करना चाहिए। असल में, यदि आपके पास ऐसी स्ट्रिंग है जिसमें कोई बाधा है और यह बहुत से पास हो जाती है, तो मैं हमेशा इसे उस कक्षा में लपेटने की अनुशंसा करता हूं जो चेक को समाहित करता है और शेष कोड को परेशानी से बाहर रखता है। इसका एक अच्छा उदाहरण तार हैं जो एक निश्चित नियमित अभिव्यक्ति को पूरा करना चाहिए। हालांकि, मैं यहां प्रश्न से अलग हो रहा हूं ...
+1

मुझे लगता है कि आपको अपने समाधान में पैरामीटर नाम की कुछ ट्रैकिंग जोड़ने की आवश्यकता है। ऐसा इसलिए होता है क्योंकि यदि आप 'frob (स्ट्रिंग फू, स्ट्रिंग बार)' को 'frob (null, "a value") के साथ' frob (string foo, string bar) 'कहते हैं, तो अधिकांश इसे भ्रमित कर पाएंगे और त्रुटि संदेश' System.ArgumentNullException: मान शून्य नहीं हो सकता है। पैरामीटर का नाम: 'System' के बजाय मूल्य'। ऑर्ग्यूमेंट नल अपवाद: मान शून्य नहीं हो सकता है। पैरामीटर नाम: foo' –

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