मैं आपके प्रश्न से सहमत हूं। इस जानबूझकर साइड इफेक्ट के साथ सबसे बड़ा मुद्दा तब होता है जब डेवलपर्स इसके बारे में नहीं जानते हैं और using
के साथ StreamReader के आस-पास के "सर्वोत्तम अभ्यास" का अंधाधुंध अनुसरण कर रहे हैं। लेकिन यह कीड़े नीचे ट्रैक करने के लिए जब यह एक लंबे समय तक रहा वस्तु की संपत्ति पर है कुछ वास्तव में कड़ी मेहनत कर सकते हैं, सबसे अच्छा (सबसे खराब?) उदाहरण मैंने देखा है
using (var sr = new StreamReader(HttpContext.Current.Request.InputStream))
{
body = sr.ReadToEnd();
}
डेवलपर पता नहीं था InputStream अब है किसी भी भविष्य की जगह के लिए तैयार है जो वहां होने की अपेक्षा करता है।
जाहिर है, एक बार जब आप आंतरिक जानते हैं तो आप using
से बचने के लिए जानते हैं और बस स्थिति को पढ़ और रीसेट कर सकते हैं। लेकिन मैंने सोचा कि एपीआई डिज़ाइन का मूल सिद्धांत साइड इफेक्ट्स से बचने के लिए था, विशेष रूप से उस डेटा को नष्ट नहीं करना जिस पर आप काम कर रहे हैं। एक वर्ग के बारे में कुछ भी निहित नहीं है जो माना जाता है कि "पाठक" को उस डेटा को साफ़ करना चाहिए जब इसे "उपयोग" करने पर किया जाता है। पाठक का निपटान स्ट्रीम के किसी भी संदर्भ को जारी करना चाहिए, स्ट्रीम को स्वयं साफ़ नहीं करना चाहिए। एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि पाठक को स्ट्रीम की अन्य आंतरिक स्थिति में बदलाव करने के बाद पसंद करना था, क्योंकि खोजकर्ता पॉइंटर की स्थिति की तरह, उन्होंने माना कि यदि आप इसके आसपास उपयोग कर रहे हैं तो आप जानबूझ कर जा रहे हैं सब कुछ के साथ किया जाना चाहिए। दूसरी तरफ, यदि आप स्ट्रीम बना रहे हैं, तो स्ट्रीम में ही using
में होगा, लेकिन यदि आप अपनी तत्काल विधि के बाहर बनाए गए स्ट्रीम को पढ़ रहे हैं, तो यह कोड की अजीब बात है डेटा साफ़ करें।
मैं करता हूँ और स्ट्रीम उदाहरणों पढ़ने कोड स्पष्ट रूप से पैदा नहीं करता है कि पर करने के लिए हमारे डेवलपर्स बता क्या ...
// save position before reading
long position = theStream.Position;
theStream.Seek(0, SeekOrigin.Begin);
// DO NOT put this StreamReader in a using, StreamReader.Dispose() clears the stream
StreamReader sr = new StreamReader(theStream);
string content = sr.ReadToEnd();
theStream.Seek(position, SeekOrigin.Begin);
(खेद मैं एक जवाब के रूप में इस जोड़ा है, में फिट नहीं होगा एक टिप्पणी, मुझे ढांचे के इस डिजाइन निर्णय के बारे में अधिक चर्चा पसंद आएगी)
इन तरह की स्थितियों में System.IO.File.ReadAllText() का उपयोग करने पर भी विचार करें। यह आसान है। –
@ डेव मार्कले: आप सही हैं। मैंने इसे एक संक्षिप्त उदाहरण के रूप में रखा है। दरअसल, असली कोड में, जिन धाराओं से मैं निपटता हूं, वे बहुत बड़े हो सकते हैं, इसलिए पहला पाठक उन्हें प्रति पंक्ति रेखा पढ़ता है, फिर स्ट्रीम को प्रति-बाइट प्रति दूसरी स्ट्रीम में कॉपी किया जाता है। –