2011-03-04 12 views
9

क्या कोई मुझे बता सकता है कि नीचे दिखाया गया कोड सी # में मान्य क्यों है और 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() पर कॉल न करने का निर्णय ले सकता है?

+7

हममम ... मैं अब इस पोस्ट के बहुत संदिग्ध हूँ, एरिक के हाल के ब्लॉग दिया ... यह वास्तव में एक वास्तविक सवाल है? –

+0

क्या यह पहले से ही पूछा नहीं गया है? http://stackoverflow.com/questions/2522822/c-using-statement-with-a-null-object –

+0

हाँ, यह मेरे लिए प्रतीत होता था। –

उत्तर

11

भाषा कल्पना स्पष्ट रूप से कहा (8.13) है कि कब्जा कर लिया मूल्य

if(tmp != null) tmp.Dispose(); 

मैं अक्सर के लिए इसका उपयोग (गैर-व्यर्थ प्रकार के आसपास कैविएट्स के साथ), अशक्त यदि आवश्यक हो तो के लिए परीक्षण किया यानी finally अनिवार्य है मेरी लाभ, शून्य हो सकता है, लेकिन जब वे नहीं हैं: निपटान की आवश्यकता है। वास्तव में, यहाँ एक उपयोगी परिदृश्य (स्वयं IEnumerable गणना) है:

IEnumerable blah = ...; // note non-generic version 
IEnumerator iter = blah.GetEnumerator(); 
using(iter as IDisposable) 
{ 
    // loop 
} 

रूप IEnumerator के गैर जेनेरिक वर्जन जरूरी IDisposable नहीं है, लेकिन जब यह है, निपटारा किया जाना चाहिए।

+0

* आईडीआईस्पोजेबल * के साथ * अच्छी चाल के लिए धन्यवाद। ठीक वही जो मेरे द्वारा खोजा जा रहा था। –

+0

यह चालाक है, मुझे यह पसंद है। – Travis

+0

यह मेरे स्वाद के लिए बहुत चालाक है :) – mafu

1

मुझे लगता है कि यह using(some_expression) के अधिक सामान्य मामले का प्राकृतिक परिणाम है, जहां some_expressionis allowed to evaluate to null

इस मामले को अधिक सामान्य से अलग करने के लिए इसे एक विशेष नियम की आवश्यकता होगी।

0

यह अगर वस्तु रिक्त है पर ध्यान नहीं देगा - http://msdn.microsoft.com/en-us/library/yh598w02.aspx

+0

यह कहता है कि आपके द्वारा लिंक किए गए दस्तावेज़ में? उस पृष्ठ पर 'शून्य' की खोज 0 हिट लौटा दी। टिप्पणी अनुभाग में –

+0

। अगर (font1! = null) ((IDISposable) font1)।(); – Anuraj

+0

> एक उपयोग कथन का अनुवाद तीन भागों में किया जाता है: अधिग्रहण, उपयोग, और निपटान। संसाधन का उपयोग पूरी तरह से एक कोशिश कथन में संलग्न है जिसमें अंत में खंड शामिल है। अंततः खंड संसाधन का निपटान करता है। यदि एक शून्य संसाधन प्राप्त किया जाता है, तो निपटान करने के लिए कोई कॉल नहीं किया जाता है, और कोई अपवाद नहीं फेंक दिया जाता है। https://msdn.microsoft.com/en-us/library/aa664736(v=vs.71).aspx – boro

संबंधित मुद्दे