हां, इसके अच्छे कारण हैं:
- यह वास्तव में क्या अशक्त है, जो एक से स्पष्ट नहीं हो सकता है की पहचान करता है
NullReferenceException
- यह अमान्य इनपुट पर कोड को विफल कर देता है, भले ही कुछ अन्य स्थिति का मतलब है कि मूल्य को कम नहीं किया गया है
- यह इस अपवाद को उत्पन्न करता है इससे पहले कि आप किसी अन्य दुष्परिणाम हो सकते हैं, जो आपके पहले प्रभाव से पहले हो सकता है
- इसका मतलब है कि आप आश्वस्त हो सकते हैं कि यदि आप पैरामीटर को किसी और चीज में पास करते हैं, तो आप उनके अनुबंध का उल्लंघन नहीं कर रहे हैं
- यह आपकी विधि की आवश्यकताओं को दस्तावेज करता है ( कोड अनुबंध का उपयोग करना , पाठ्यक्रम के लिए और भी बेहतर है)
अब अपनी आपत्तियों के लिए:
- यह धीमा है : क्या आपने पाया है कि यह वास्तव में आपके कोड में अड़चन है, या आप अनुमान लगा रहे हैं? तुच्छता चेकों बहुत जल्दी कर रहे हैं, और अधिकांश मामलों में वे कर रहे हैं नहीं टोंटी होने जा रहा
- यह कोड को बनाए रखने के लिए कठिन बनाता है : मुझे लगता है कि इसके विपरीत। मुझे लगता है कि यह कोड का उपयोग करना आसान है, जहां यह स्पष्ट है कि कोई पैरामीटर अशक्त हो सकता है या नहीं, और जहां आप आश्वस्त हैं कि यह स्थिति लागू है।
और आपके दावे के लिए:
जाहिर है, कोड का उपयोग करता है कि वैसे भी एक अपवाद फेंक देंगे।
वास्तव में? विचार करें:
void f(SomeType s)
{
Console.WriteLine("I've got a message of {0}", s);
}
यह उपयोग करता है s
, लेकिन यह एक अपवाद नहीं है। यदि यह s
अशक्त होने के लिए अमान्य है , और यह इंगित करता है कि कुछ गलत है, तो एक अपवाद यहां सबसे उपयुक्त व्यवहार है।
अब जहाँ आप उन तर्क सत्यापन जाँचों को रखते हैं वह एक अलग मामला है। आप अपने स्वयं के वर्ग के भीतर सभी कोड पर भरोसा करने का निर्णय ले सकते हैं, इसलिए निजी तरीकों पर परेशान न हों। आप अपनी बाकी विधानसभा पर भरोसा करने का फैसला कर सकते हैं, इसलिए आंतरिक तरीकों पर ध्यान न दें। आपको सार्वजनिक विधियों के तर्कों को लगभग निश्चित रूप से मान्य करना चाहिए।
एक साइड नोट: सिंगल-पैरामीटर कंस्ट्रक्टर ओवरलोड का ArgumentNullException
सिर्फ पैरामीटर नाम होना चाहिए, इसलिए आपका टेस्ट होना चाहिए:
if (s == null)
{
throw new ArgumentNullException("s");
}
वैकल्पिक रूप से आप एक विस्तार विधि बना सकते हैं, जिससे कुछ हद तक तनाव हो सकता है:
s.ThrowIfNull("s");
मेरे (जेनेरिक) एक्सटेंशन विधि के संस्करण में, मैं इसे मूल मूल्य वापस कर देता हूं यदि यह गैर अशक्त है, तो आप चीजों को लिखने की अनुमति देते हैं:
this.name = name.ThrowIfNull("name");
आपके पास एक अधिभार हो सकता है जो पैरामीटर नाम नहीं लेता है, यदि आप उस बारे में बहुत परेशान नहीं हैं।