2012-08-29 9 views
9

दोनों BinaryReaderconstructors एक धारा पैरामीटर की आवश्यकता है। मैं अंतर्निहित धारा रखने के लिए के रूप में किया जाता है जब मैं BinaryReader पूरा कर लेने, मैं अभी भी अपने Dispose() बुलाना चाहिए की जरूरत है? यदि नहीं, तो क्या अब की आवश्यकता के लिए कोई अन्य सफाई नहीं है?अगर मुझे "लपेटा" स्ट्रीम को संरक्षित करने की आवश्यकता है तो क्या मुझे बाइनरी रीडर का निपटान करना चाहिए?

मैं क्योंकि मैं एक स्पष्ट उत्तर MSDN page for BinaryReader.Dispose() पर नहीं मिल सकता है पूछ रहा हूँ।

छोटे अलावा

मेरे संदर्भ में मैं BinaryReader का उपयोग बाइट्स के एक जोड़े, जिसके बाद मैं वापस यह क्या था पहले BinaryReader प्रारंभ किया गया था करने के लिए धारा की स्थिति सेट पढ़ने के लिए।

इसके अलावा, मैं नेट 4.

उत्तर

11

नहीं उपयोग कर रहा हूँ, यह BinaryReader के निपटान नहीं करने के लिए ठीक आप धारा खुला रखना चाहते हैं है।

मैं शायद समझाने के लिए हालांकि क्या हो रहा है एक टिप्पणी जोड़ने चाहते हैं - और मुझे यकीन है कि यह गारंटी कि BinaryReader केवल जहाँ तक आप BinaryReader से पढ़ा है धारा से पढ़ा है जाएगा कि क्या नहीं कर रहा हूँ। .. उदाहरण के लिए, यह एक बफर में और अधिक पढ़ा होगा। जाहिर है कि अगर आप धारा की तलाश करते हैं तो यह कोई समस्या नहीं है।

+0

हाँ मैंने अपने प्रश्न को उल्लेख करने के लिए अद्यतन किया है, मैंने केवल 'बाइनरी रीडर' के साथ कुछ बाइट्स पढ़े हैं। –

12

यदि आप (या कोई भी उत्तर देने के लिए इन्हें पढ़ रहे हैं) वीएस 2012 का उपयोग कर रहे हैं .NET 4.5 (या बाद में) के साथ आप BinaryReader बना सकते हैं जो स्ट्रीम को बंद नहीं करेगा। उदा .:

using(var reader = new BinaryReader(theStream, new UTF8Encoding(), true) 
{ 
//... 
} 

new UTF8Encoding डिफ़ॉल्ट अगर आप BinaryReader (स्ट्रीम) निर्माता का इस्तेमाल किया है, तो आप UTF8Encoding नहीं करना चाहते हैं, तो आप कुछ और का उपयोग कर सकते है। true "हां, स्ट्रीम खोलें" को दर्शाता है।

2

अगर यह मैं था, मैं सिर्फ tidyness की खातिर BinaryReader के निपटान था, ... लेकिन मैं यह भी सुनिश्चित करना चाहते हैं कि मैं इस this constructor overload साथ BinaryReader बनाया:

public BinaryReader(
    Stream input, 
    Encoding encoding, 
    bool  leaveOpen 
) 

जहां निर्दिष्ट करने true रूप leaveOpen तर्क पाठक अंतर्निहित धारा खुला छोड़ने के लिए निर्देश देता है।

इस मार्ग जा रहे हैं, तो आप स्पष्ट गुंजाइश और चीजों की स्वामित्व बनाते हैं। इस तरह भ्रम और गलतफहमी के लिए कम कमरा।

+1

मैं आपकी टिप्पणी 100% से सहमत हूं, और अगर मैं 4.5 का उपयोग कर रहा था तो शायद मैंने सवाल नहीं पूछा होगा क्योंकि शायद मैंने 'leaveOpen' तर्क देखा होगा। –

3

वहां पहले से ही एक स्वीकृत जवाब है, लेकिन यह मुझे गंदा लग रहा है :-) मुझे लगता है कि हम कर सकते हैं बनाता है बेहतर:

  1. आप .NET 4.5 का उपयोग कर रहे हैं, तो आप 3-आर्ग निर्माता का उपयोग करना चाहिए बाइनरी रीडर का। किया हुआ।
  2. आप .NET 3.5/4.0 का उपयोग कर रहे हैं, तो आप किसी अन्य समाधान

जॉन स्कीट (स्वीकार किए जाते हैं जवाब) बस BinaryReader निपटाने कभी नहीं करने के लिए पता चलता है की जरूरत है। खैर, यह काम करता है, लेकिन भ्रम का स्रोत हो सकता है।

एक वैकल्पिक समाधान BinaryReader को पारित करने से पहले एक NonClosingStreamWrapper में अपनी स्ट्रीम रैप करने के लिए, हो सकता है।बाइनरी रीडर डिस्प्ले होने पर रैपर को बंद कर देगा, लेकिन NonClosingStreamWrapper आपके अंतर्निहित स्ट्रीम का निपटान नहीं करेगा। आप अभी भी उपयोग कर सकते हैं। बाइनरीस्ट्रीम (या इससे भी बेहतर, उपयोग-पैटर्न) पर विचार करें।

बहुत विडंबना यह है कि, जोनस्केट ने पहले ही ऐसा करने के लिए एक गैर क्लोजिंगस्ट्रीमवापर बनाया है। यह उनके miscutil library का हिस्सा है। (लेकिन लाइसेंस नोट करें)

using(var reader = new BinaryReader(new NonClosingStreamWrapper(myStream))) 
{ 
//... 
} 
संबंधित मुद्दे

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