जब आप किसी नल इंस्टेंस पर एक्सटेंशन विधि कहलाते हैं तो फेंकने का सबसे अच्छा अपवाद प्रकार माना जाता है (जहां एक्सटेंशन विधि इसे अनुमति नहीं देती है)? चूंकि विस्तार विधियां स्थिर विधियों के अलावा कुछ भी नहीं हैं, इसलिए आप तर्क दे सकते हैं कि यह ArgumentNullException होना चाहिए, लेकिन दूसरी तरफ वे उदाहरण विधियों की तरह उपयोग किए जाते हैं, इसलिए NullReferenceException का उपयोग करना अधिक स्वाभाविक हो सकता है। के निम्नलिखित उदाहरण लेते हैं:विस्तार विधि से ArgumentNullException या NullReferenceException?
public static string ToInvariantString(this IFormattable value, string format)
{
return value.ToString(format, CultureInfo.InvariantCulture);
}
इस तरह अगर मान पैरामीटर रिक्त है एक NullReferenceException फेंक दिया जाएगा।
अन्य उदाहरण होगा:
public static string ToInvariantString(this IFormattable value, string format)
{
if (value == null) throw new ArgumentNullException("value");
return value.ToString(format, CultureInfo.InvariantCulture);
}
संपादित करें: जवाब आप एक विस्तार के तरीकों के लिए एक स्थिर विधि की तरह कहा जा सकता है कि ने बताया है में से कुछ में और उन मामलों में एक अशक्त संदर्भ अपवाद गलत होगा, जो एक महान बिंदु है, और वास्तव में मेरी चिंताओं में से एक, यह सुनिश्चित नहीं है कि मैं इस मामले में पहली जगह क्यों उल्लेख करना भूल गया था।
किसी ने यह भी बताया कि एक NullReferenceException फेंकना गलत है, और हाँ, यह है। यही कारण है कि मैं इसे फेंक नहीं देता, मैं बस इसे होने देता हूं (सीएलआर इसे फेंक दें) विधि की रक्षा नहीं करके।
मुझे लगता है कि मैं ArgumentNullException (जो मैंने अभी तक उपयोग किया है) का पक्ष लेता हूं, लेकिन मुझे अभी भी लगता है कि NullReferenceException के खिलाफ बहस करने के लिए कम से कम कमरा है क्योंकि यह उन स्थानों पर अधिक प्राकृतिक लगता है जहां विधि जा रही है इस्तेमाल किया गया।
ग्रेट टिप्पणियां और जैसा कि मैंने पोस्ट के मेरे संपादन में उल्लेख किया है, यही कारण है कि मैं स्पष्ट रूप से NullReferenceException को फेंक नहीं देता, मैं अभी भी सीएलआर को फेंक देता हूं। –
"वास्तव में एक शून्य संदर्भ नहीं हुआ"। हाँ इसने किया; आपने एक शून्य संदर्भ पारित किया और विधि ने इसे कम करने की कोशिश की। – piedar
@piedar विधि ने इसे हटाने की कोशिश की, रनटाइम नहीं! –