क्या कोई मुझे बता सकता है कि नीचे दिखाया गया कोड सी # में मान्य क्यों है और Console.WriteLine
पर कॉल निष्पादित करता है?सी # में वैध केस का उपयोग क्यों कर रहा है?
using (null)
{
Console.WriteLine ("something is here")
}
यह संकलित करता है (अंत में ब्लॉक दिखाया गया है)। जैसा कि आप देख सकते हैं कि संकलक Dispose()
विधि निष्पादित नहीं करने का निर्णय लेता है और endfinally
निर्देश पर कूदता है।
IL_0013: ldnull
IL_0014: ceq
IL_0016: stloc.1
IL_0017: ldloc.1
IL_0018: brtrue.s IL_0021 // branches here and decide not to execute Dispose()
IL_001a: ldnull
IL_001b: callvirt instance void [mscorlib]System.IDisposable::Dispose()
IL_0020: nop
IL_0021: endfinally
हालांकि, अगर मैं निम्नलिखित कोड चलाने के लिए, यह एक NullReferenceException
(जो की उम्मीद है) के साथ असफल हो जायेगी:
((IDisposable)null).Dispose();
IL_0023: ldnull
IL_0024: callvirt instance void [mscorlib]System.IDisposable::Dispose()
क्यों पहले संस्करण संकलित करता है? संकलक Dispose()
निष्पादित न करने का निर्णय क्यों लेता है? क्या कोई अन्य मामला है जब संकलक using
ब्लॉक में Dispose()
पर कॉल न करने का निर्णय ले सकता है?
हममम ... मैं अब इस पोस्ट के बहुत संदिग्ध हूँ, एरिक के हाल के ब्लॉग दिया ... यह वास्तव में एक वास्तविक सवाल है? –
क्या यह पहले से ही पूछा नहीं गया है? http://stackoverflow.com/questions/2522822/c-using-statement-with-a-null-object –
हाँ, यह मेरे लिए प्रतीत होता था। –