2009-07-05 11 views
28

मेरे पास एक तरीका है जो एक बाइनरीवाइटर का उपयोग करके लिखने के लिए स्ट्रीम प्राप्त करता है। लेकिन जब मैं इस बाइनरीवाइटर का निपटान करता हूं तो यह धारा को बंद कर देता है। क्या मैं इसे अनजान छोड़ सकता हूं ताकि मैं अपनी स्ट्रीम को खोल सकूं?क्यों बाइनरीवाइटर बाहरी स्ट्रीम को निपटान पर बंद कर देता है, और इसे कैसे रोकें? (.NET C#)

उत्तर

10

बस निपटान न करें, इसके बजाए फ्लश का उपयोग करें, इसकी सुरक्षितता।

+0

हाँ, मैंने प्रतिबिंबक पर यह जांच की और यह सच है। –

+4

यह सुरक्षित है _today_। क्या आप यह सुनिश्चित करने के लिए .NET की रिलीज पर रिफ्लेक्टर का उपयोग करने जा रहे हैं कि यह सुरक्षित रहेगा? यह एक समाधान नहीं है। -1। –

+2

यह हमेशा सुरक्षित रहेगा। सिर्फ लेखक अर्थशास्त्र के कारण। बस सोचें कि यह अभी क्यों निपटान है (संकेत msdn पर उदाहरण देखें)। यह भी ध्यान रखें कि यह .NET में एकमात्र ऐसा स्थान नहीं है जो गलत तरीके से IDISposable का उपयोग करता है, उदाहरण के लिए अच्छी तरह से जानते हैं डब्ल्यूसीएफ चैनलों के साथ समस्या का निपटान करें। –

21

BinaryWriter के मामले में, यह एक प्रत्यक्ष विकल्प नहीं है (हालांकि कुछ स्ट्रीम रैपर आपको इसे नियंत्रित करने की अनुमति देते हैं, उदाहरण के लिए GZipStream आदि)।

जॉन के पास MiscUtil में एक गैर-क्लोजिंगस्ट्रीमवापर है जो काम करना चाहिए: आप अपनी स्ट्रीम को गैर-बंद करने वाले रैपर में लपेटें, और रैपर को BinaryWriter पर दें। यह अनिवार्य रूप से Close() और Dispose() को छोड़कर सब कुछ के माध्यम से गुजरता है।

+0

महान पुस्तकालय, अच्छा काम! –

+0

लिंक टूटा हुआ है: http://www.yoda.arachsys.com/csharp/miscutil/ – colithium

+0

क्या आपको नहीं लगता कि कुछ हैक है? आप बिन्नेरीवाइटर के व्यवहार (और धारणाओं) को रैपर के साथ बेवकूफ बनाकर बदलने का सुझाव देते हैं? –

9

संरक्षित बाइनरीवाइटर। डिस्प्ले (बूल) विधि वर्चुअल है, और यह सब स्ट्रीम बंद कर देता है (आप यह जांच सकते हैं कि यह Reflector में सत्य है)। - इस विधि को निपटान() विधि द्वारा बुलाया जाता है।

आप बस बाइनरीवाइटर से एक वर्ग का उत्तराधिकारी प्राप्त कर सकते हैं और कुछ भी करने के लिए निपटान (बूल) विधि को ओवरराइड कर सकते हैं, या कुछ और कुछ भी नहीं कर सकते हैं।

47

.NET 4.5 के रूप में, बाइनरीवाइटर क्लास में एक नया कन्स्ट्रक्टर है जो यह इंगित करने के लिए एक बूलियन पैरामीटर लेता है कि स्ट्रीम को खोलना है या नहीं।

रेफरी: http://msdn.microsoft.com/en-us/library/gg712841.aspx

public BinaryWriter(
    Stream output, 
    Encoding encoding, 
    bool leaveOpen 
) 
+0

खुशी है कि आपने यह नई जानकारी प्रदान की है। धन्यवाद! –