(विजुअल स्टूडियो 2017 में नए अपवाद सहायक के बारे में जानकारी के लिए इस उत्तर का अंत देखें)
इस कोड पर विचार करें:
String s = null;
Console.WriteLine(s.Length);
यह NullReferenceExceptionदूसरी पंक्ति में फेंक देगा और आप जानना चाहते हैं कि .NET आपको यह क्यों नहीं बताता है कि sअपवाद के फेंकने पर यह अशक्त था।
यह समझने के लिए कि आपको जानकारी का वह टुकड़ा क्यों नहीं मिला, जिसे आपको याद रखना चाहिए कि यह C # स्रोत नहीं है जो निष्पादित करता है, बल्कि IL:
IL_0001: ldnull
IL_0002: stloc.0 // s
IL_0003: ldloc.0 // s
IL_0004: callvirt System.String.get_Length
IL_0009: Call System.Console.WriteLine
यह callvirtओपकोड है जो फेंकता है NullReferenceExceptionऔर यह करता है कि जब मूल्यांकन स्टैक पर पहला तर्क एक अशक्त संदर्भ है (जो कि उपयोग करके लोड किया गया था ldloc.0)।
अगर .NET को यह बताने में सक्षम होना चाहिए कि यह sएक अशक्त संदर्भ था, तो इसे किसी तरह से ट्रैक करना चाहिए कि मूल्यांकन स्टैक मूल रूप पर पहला तर्क s। इस मामले में हमारे लिए यह देखना आसान है कि यह हैs अशक्त था लेकिन क्या होगा यदि मूल्य किसी अन्य फ़ंक्शन कॉल से वापसी मान था और किसी भी चर में संग्रहीत नहीं किया गया था? वैसे भी, इस तरह की जानकारी वह नहीं है जो आप वर्चुअल मशीन जैसे .NET वर्चुअल मशीन में ट्रैक करना चाहते हैं।
इस समस्या से बचने के लिए मेरा सुझाव है कि आप सभी सार्वजनिक पद्धति कॉल में तर्क-वितर्क की जाँच करें (जब तक कि आप अशक्त संदर्भ की अनुमति न दें):
public void Foo(String s) {
if (s == null)
throw new ArgumentNullException("s");
Console.WriteLine(s.Length);
}
यदि नल को विधि से पास किया जाता है तो आपको एक अपवाद मिलता है जो ठीक बताता है कि समस्या क्या है ( sयह शून्य है)।
चार साल बाद विजुअल स्टूडियो 2017 में अब एक नया अपवाद सहायक है जो यह बताने की कोशिश करेगा कि एक NullReferenceExceptionफेंक दिए जाने पर क्या अशक्त है। यह आपको आवश्यक जानकारी देने में सक्षम है जब यह एक विधि का वापसी मूल्य है जो शून्य है:

ध्यान दें कि यह केवल एक DEBUG बिल्ड में काम करता है।