दिलचस्प पोस्ट
एंड्रॉइड: पार्सलेट योग्य और सीरियलजबल के बीच अंतर? सम्मिश्रण ओपनसीवी में तेजी को नहीं हटाता है बिना नई लाइन या अंतरिक्ष कैसे मुद्रित करें? सफारी में CSS3 एनीमेशन काम नहीं कर रहा है एक सरणी में प्रत्येक आइटम की जावा गणना घटना जावा दिनांक और समय एपीआई में क्या गलत है? अजगर कैसे तैयार किए गए शब्दकोशों में निर्मित है NSTimer बंद नहीं करता है ओएस एक्स फ्रेमवर्क लाइब्रेरी लोड नहीं हुई: 'इमेज नहीं मिली' एएसपी.नेट एमवीसी के साथ jquery – अजाक्स सक्षम वेब सेवा को बुला रहा है अंत में ब्लॉक में अपवाद फेंकता तालिका चर पर एक अनुक्रमणिका बनाना जांचें कि सरणी के सभी मूल्य समान हैं या नहीं HTML तालिका में लंबवत (घुमाए गए) पाठ सामग्री के आधार पर एक आइफ्रेम का आकार बदलना

क्या स्ट्रीमरीडर का निपटारा धारा बंद कर देता है?

मैं लिखने के तरीकों पर एक स्ट्रीम भेज रहा हूं, और उन विधियों में मैं बाइनरी रीडर / क्रिस्टरी का उपयोग कर रहा हूं। जब पाठक / लेखक का निपटारा हो जाता है, या तो इसका using या बस संदर्भित नहीं होने पर, क्या धारा भी बंद है ??

मैं एक बाइनरी रीडर / राइटर भेजूंगा, लेकिन मैं एक स्ट्रीम रीडर का उपयोग कर रहा हूं (शायद मुझे उसके चारों ओर जाना चाहिए। मैं केवल GetLine और ReadLine के लिए उपयोग कर रहा हूं)। यह काफी परेशानी है अगर हर बार एक लेखक / पाठक बंद हो जाता है तो यह धारा को बंद कर देता है।

वेब के समाधान से एकत्रित समाधान "क्या स्ट्रीमरीडर का निपटारा धारा बंद कर देता है?"

हां, BinaryReader , BinaryReader , BinaryReader और BinaryReader सभी अपने निहित धाराओं को बंद / BinaryReader करते हैं जब आप उन पर BinaryReader करते हैं। वे धारा का निपटारा नहीं करते हैं , यदि पाठक / लेखक सिर्फ एकत्र कचरा है – आपको हमेशा पाठक / लेखक का निपटान करना चाहिए, वैसे ही using कथन के साथ। (वास्तव में, इन कक्षाओं में से कोई भी अंतिम रूप देने वाला नहीं है, न ही उन्हें होना चाहिए।)

निजी तौर पर मैं धारा के लिए एक प्रयोग के बयान भी पसंद करता हूं। आप ब्रेक के बिना कथनों using कर घोंसले को काफी सुबोध से using सकते हैं:

 using (Stream stream = ...) using (StreamReader reader = new StreamReader(stream, Encoding.Whatever)) { } 

यद्यपि स्ट्रीम के लिए using बयान कुछ अनावश्यक है (जब तक कि StreamReader कन्स्ट्रक्टर एक अपवाद को फेंकता न हो) मैं इसे सबसे अच्छा अभ्यास मानता हूं, अगर आप स्ट्रीम StreamReader से छुटकारा पाएं और बाद की तारीख में सीधे स्ट्रीम का उपयोग करें, तो आपके पास पहले से ही होगा सही निपटान सिमेंटिक

यह एक पुराना है, लेकिन मैं आज भी ऐसा कुछ करना चाहता था और पाया कि चीजें बदल गई हैं। चूंकि 4.5 पूर्ण है, वहाँ एक leaveOpen है leaveOpen तर्क:

 public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen ) 

केवल एक समस्या यह है कि यह पूरी तरह से स्पष्ट नहीं है कि अन्य मापदंडों के लिए क्या सेट करना है। यहाँ कुछ मदद है:

StreamReader कन्स्ट्रक्टर (स्ट्रीम) के लिए एमएसडीएन पृष्ठ से:

यह कन्स्ट्रक्टर UTF8Encoding के लिए एन्कोडिंग को प्रारंभ करता है, स्ट्रीम पैरामीटर का उपयोग करके बेसस्ट्रीम प्रॉपर्टी, और आंतरिक बफर आकार 1024 बाइट्स तक है।

यह सिर्फ पता detectEncodingFromByteOrderMarks कि detectEncodingFromByteOrderMarks जो स्रोत कोड द्वारा देखते हैं , वह true

 public StreamReader(Stream stream) : this(stream, true) { } public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks) : this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) { } 

यह अच्छा होगा यदि उन कुछ डिफॉल्ट्स का खुलासा किया गया हो या यदि तर्क वैकल्पिक थे ताकि हम उन लोगों को निर्दिष्ट कर सकें जो हम चाहते हैं

हाँ यह करता है। आप रिफ्लेक्टर के साथ कार्यान्वयन को देखकर इसकी पुष्टि कर सकते हैं

 protected override void Dispose(bool disposing) { try { if ((this.Closable && disposing) && (this.stream != null)) { this.stream.Close(); } } finally { if (this.Closable && (this.stream != null)) { this.stream = null; this.encoding = null; this.decoder = null; this.byteBuffer = null; this.charBuffer = null; this.charPos = 0; this.charLen = 0; base.Dispose(disposing); } } } 

छह साल देर हो चुकी है लेकिन शायद यह किसी को मदद कर सकता है

स्ट्रीम रीडर कनेक्शन बंद कर लेता है, जब इसका निपटारा होता है। हालांकि, "स्ट्रीम स्ट्रीम = …) {…}" का उपयोग करके स्ट्रीमरिडर / स्ट्रीम ड्रायवर के साथ स्ट्रीम दो बार निपटारा हो सकता है: (1) जब स्ट्रीमरिडर ऑब्जेक्ट का निपटारा होता है (2) और जब स्ट्रीम का उपयोग करते हुए ब्लॉक बंद कर देता है। इसके परिणामस्वरूप सीए 2202 की चेतावनी में वीएस का कोड विश्लेषण चल रहा है।

सीए 2202 पृष्ठ से सीधे एक और समाधान, एक कोशिश / अंत में ब्लॉक का उपयोग करना है सही तरीके से सेटअप करें, यह केवल कनेक्शन को एक बार बंद कर देगा।

CA2202 के निचले भाग के पास , माइक्रोसॉफ्ट निम्न उपयोग करने की अनुशंसा करता है:

 Stream stream = null; try { stream = new FileStream("file.txt", FileMode.OpenOrCreate); using (StreamWriter writer = new StreamWriter(stream)) { stream = null; // Use the writer object... } } finally { if(stream != null) stream.Dispose(); } 

के बजाय…

 // Generates a CA2202 warning using (Stream stream = new FileStream("file.txt", FileMode.Open)) using (XmlReader reader = new XmlReader (stream)) { // Use the reader object... } 

हाँ। कॉलिंग डिस्पोज () ऑन और आईडीिसपोज़बल (जो "प्रयोग" करता है) को ऑब्जेक्ट को अपने सभी संसाधनों को साफ करना चाहिए। इसमें धाराओं को फ्लश करने और उनके फाइल डिस्क्रिप्टर को बंद करना शामिल है।

अगर, आपके मामले में, आप इसे अन्य तरीकों से पारित करना चाहते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि उन विधियों का उपयोग किसी ब्लॉक में पढ़ने / लिखना न करें।

यह तय करने का एक आसान तरीका है कि आपको स्ट्रीमवर्डेटर वर्गों को ओवरराइड करना है, तो विधि निकालें। इसे कैसे करें पर कोड के लिए यहां मेरी पोस्ट देखें:

क्या एक धारावाहिक को अंतर्निहित स्ट्रीम को बंद कर दिया जाता है?

या तो "कीवर्ड" का प्रयोग करके या स्पष्ट रूप से निपटाने के लिए कॉलिंग का प्रवाह