मैंने हमेशा सोचा है कि this
के लिए उदाहरण विधि शरीर के अंदर शून्य होना असंभव है। सरल कार्यक्रम के बाद यह दर्शाता है कि यह संभव है। क्या यह कुछ दस्तावेज व्यवहार है?यह == .NET उदाहरण विधि के अंदर शून्य - यह क्यों संभव है?
class Foo
{
public void Bar()
{
Debug.Assert(this == null);
}
}
public static void Test()
{
var action = (Action)Delegate.CreateDelegate(typeof (Action), null, typeof(Foo).GetMethod("Bar"));
action();
}
अद्यतन
मैं जवाब यह कहते हुए कि यह कैसे इस विधि से प्रलेखित है कि के साथ सहमत हैं। हालांकि, मैं वास्तव में इस व्यवहार को समझ नहीं पा रहा हूं। विशेष रूप से क्योंकि यह नहीं है कि सी # कैसे डिज़ाइन किया गया है।
हम किसी से एक रिपोर्ट हो गया था (संभावना नेट समूहों सी # का उपयोग कर में से एक (सोचा था कि यह अभी तक उस समय) पर नामित नहीं किया गया था सी #) जो लिखे कोड एक अशक्त पर एक विधि कहा जाता था कि सूचक, लेकिन को अपवाद नहीं मिला क्योंकि विधि किसी भी फ़ील्ड तक पहुंच नहीं पाई थी (यानी "यह" शून्य था, लेकिन विधि में इसका उपयोग नहीं किया गया था)। उस विधि को ने एक और विधि कहा जिसने इस बिंदु का उपयोग किया और अपवाद फेंक दिया, और कुछ सिर-स्क्रैचिंग शुरू हुई। उन्हें बाहर निकालने के बाद, उन्होंने हमें इसके बारे में एक नोट भेजा। हमने सोचा था कि एक शून्य उदाहरण पर एक विधि को कॉल करने में सक्षम होने पर थोड़ा अजीब था। पीटर गोल्डे ने यह देखने के लिए कुछ परीक्षण किया कि पेर्फ प्रभाव हमेशा कॉलवर्ट का उपयोग कर रहा था, और यह इतना छोटा था कि हमने परिवर्तन करने के लिए का निर्णय लिया।
http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx
संकेत के लिए मेरा उत्तर देखें कि सीएलआर जानबूझकर .NET 1.0 में इस तरह से डिज़ाइन किया गया था।आपके द्वारा उद्धृत आलेख एक अलग (गैर-प्रतिनिधि) स्थिति के बारे में है, जो एक कंपाइलर ऑप्टिमाइज़ेशन होगा - उदाहरण के प्रकार को स्थिर रूप से निर्धारित किया जा सकता है जब एक प्रत्यक्ष कॉल द्वारा 'कॉलवर्ट' को बदलना। ध्यान दें कि सीएलआर को 'कॉलवर्ट' के दौरान 'NullReferenceException' को फेंकने का कारण 'इस संदर्भ' के आधार पर एक वीएमटी लुकअप की आवश्यकता है; संदर्भ की जांच करने के लिए सिर्फ एक अर्थपूर्ण इच्छा नहीं है। –
संबंधित: http://stackoverflow.com/q/3143498/158779 –
आईएमएचओ, यह दुर्भाग्यपूर्ण है कि निर्दिष्ट करने के लिए कोई मानक तरीका नहीं है (शायद गुणों के माध्यम से) यह निर्दिष्ट करने के लिए कि 'कॉलवर्ट' की बजाय' कॉल 'के साथ एक विधि लागू की जानी चाहिए जो उन प्रकारों को अनुमति देता है जो मूल्यों को समाहित करते हैं [जैसे 'स्ट्रिंग'] उन सदस्यों के लिए जो डिफ़ॉल्ट-मूल्यवान स्टोरेज स्थानों पर काम कर सकते हैं। 'अगर (someString.IsNullOrEmpty)' कहें तो 'if (String.IsNullOrEmpty (someString))' से अधिक क्लीनर IMHO होगा। – supercat