2012-11-29 26 views
5

मुझे एफसीएल कोड में असामान्य नमूना मिला।बाइनरी रीडर। डिस्प्ले (बूल डिस्प्लेिंग) स्ट्रीम के लिए स्थानीय संदर्भ बनाता है। क्यूं कर?

यह System.IO.BinaryReader में विधि है:

protected virtual void Dispose(bool disposing) { 
     if (disposing) { 
      Stream copyOfStream = m_stream; 
      m_stream = null; 
      if (copyOfStream != null && !m_leaveOpen) 
       copyOfStream.Close(); 
     } 
     m_stream = null; 
     m_buffer = null; 
     m_decoder = null; 
     m_charBytes = null; 
     m_singleChar = null; 
     m_charBuffer = null; 
    } 

निष्पादन तर्क पर क्या प्रभाव 'copyOfStream' है?

उत्तर

9

ऐसा इसलिए किया गया है कि Stream.Close() अपवाद फेंकने पर भी m_stream को शून्य पर सेट किया जाएगा।

टिप्पणी

अपवाद किस तरह Stream.Close()

जब आप एक धारा बंद करते हैं, किसी भी बफ़र उत्पादन प्लावित है पर उठाया जा सकता है के जवाब में, जो फेंक कर सकते हैं एक अपवाद, उदाहरण के लिए नेटवर्क विफलता के कारण।

मुझे यकीन नहीं है कि यह एक तर्क है। आम तौर पर हम ब्लॉक का उपयोग करने में निपटान कर रहे हैं, और इसका मतलब यह है कि वेरिएबल कभी भी

उपरोक्त में, यदि Stream.Close() फेंकता है, तो m_stream पहले से ही शून्य हो जाएगा। निम्नलिखित विकल्प के साथ, m_stream अशक्त करने के लिए सेट नहीं किया जाएगा Stream.Close() फेंकता है:

m_stream.Close(); // <== throws 
m_stream = null; // <== not executed if Close() throws 

लेकिन इस मामले में अगर हम अपवाद-सुरक्षा के बारे में बात कर रहे हैं, किसी को फेंक करने के लिए कॉल कर सकते हैं पुन: प्रयास विधि और NullReferenceException

का सामना करना पड़ेगा, क्योंकि यह अशक्त के लिए परीक्षण यह एक NullReferenceException फेंक नहीं होगा:

if (copyOfStream != null && !m_leaveOpen) 
     copyOfStream.Close(); 
+0

धन्यवाद! मैंने यह भी मान लिया कि विकल्प, लेकिन Stream.Close() पर किस प्रकार का अपवाद उठाया जा सकता है? मुझे कुछ नहीं मिला। – Illivion

+0

मुझे यकीन नहीं है कि यह एक तर्क है। आम तौर पर हम ब्लॉक का उपयोग करने में निपटान कर रहे हैं, और इसका मतलब है कि वेरिएबल कभी भी उपयोग नहीं किया जाएगा। लेकिन इस मामले में अगर हम अपवाद-सुरक्षा के बारे में बात कर रहे हैं, तो कोई व्यक्ति विधि का निपटान करने के लिए कॉल पुनः प्रयास कर सकता है और NullReferenceException का सामना करेगा। –

+0

हो सकता है कि एक और धागा किसी भी तरह हमारी अशक्त जांच और उदाहरण विधि 'बंद()' के लिए हमारी कॉल के बीच '' null' को m_stream' सेट कर सकते हैं? –