2010-10-20 9 views
17

नीचे दिए गए कोड में, क्या कोई मौका है कि जीसी मेमोरीस्ट्रीम को साफ़ कर देगा ताकि ToArray विफल हो जाए, क्योंकि यह उपयोग कथन के बाहर है?मेमोरीस्ट्रीम को कॉल कर रहा है। ToArray() निपटान के बाद खतरनाक है?

private static byte[] getBytes() 
{ 
    MemoryStream ms = null; 

    using (ms = new MemoryStream()) 
    { 
     // ... 
    } 

    return ms.ToArray(); 
} 

उत्तर

19

नहीं, इसका कोई मौका नहीं है। यह करना सुरक्षित है - MemoryStream बाइट सरणी के लिए एक मजबूत संदर्भ रखता है।

मैं अगर मैं गारंटी देता है के बारे में कोई दस्तावेज़ीकरण देख सकते हैं देखेंगे ...

संपादित करें: के छाँटें ...

MemoryStream.Close से:

बफर अभी भी एक पर उपलब्ध है एक बार स्ट्रीम बंद हो जाने पर MemoryStream

बेशक है कि यह Dispose के लिए गारंटी नहीं है, लेकिन वह Stream.Close कॉल करने के लिए दस्तावेज़ीकरण किया गया है।

MemoryStream.Dispose(bool) तो सरणी को रिलीज़ करने के लिए ओवरराइड किया जा सकता है, लेकिन यह मेरे अनुभव में नहीं है, और यह इस बिंदु पर एक तोड़ने वाला बदलाव होगा।

+0

मुझे दस्तावेज़ों में कुछ भी नहीं मिला, लेकिन इसके लिए हमारे पास मोनो में परीक्षण हैं और कोड इस मामले में काम करता है। बीटीडब्ल्यू, ms.Close() को कॉल करने की कोई आवश्यकता नहीं है। – Gonzalo

+0

बस एक नोट: MemoryStream.Close के लिए .NET 4.0 दस्तावेज़ (http://msdn.microsoft.com/en-us/library/system.io.stream.close%28v=vs.100%29.aspx) * * स्ट्रीम में बंद होने के बाद "बफर अभी भी मेमोरीस्ट्रीम पर उपलब्ध है।" बयान। मुझे आश्चर्य होता है कि क्या वे बदलते व्यवहार को हवा में डाल देते हैं। –

+0

@scottmarlowe: यह Stream.Close के लिए प्रलेखन है। ऐसा लगता है कि उन्होंने मेमोरीस्ट्रीम के लिए "ओवरराइडिंग दस्तावेज" प्रदान करना बंद कर दिया है। बंद करें। वास्तविक व्यवहार को बदलने से बहुत सारे कोड टूट जाएंगे। –

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