2013-08-15 8 views
7

यदि आप एक एपीआई डिजाइन कर रहे हैं, या यहां तक ​​कि अपने कोड के भीतर भी, और आपकी विधि Stream स्वीकार करती है, तो क्या यह स्थिति की जांच करने और इसे शुरू करने के लिए रीसेट करने का तरीका है, बशर्ते CanSeektrue इसका उपयोग करने से पहले?इसका उपयोग करने के बाद स्ट्रीम छोड़ने का सामाजिक रूप से स्वीकार्य तरीका क्या है?

यदि हां, तो ऐसा कोई तरीका क्यों नहीं है जो Stream कक्षा पर ही ऐसा करता है?

साल मैं Stream संभालने से कई बार बाहर पकड़ा गया है ओवर स्थिति 0.

में मेरी विधि में आता है और यह सही उपयोग करने के बाद Stream जहां संभव हो पुनर्स्थापित करने के लिए किया जाता है?

वैकल्पिक रूप से, Stream को हमेशा आसपास के पारित होने के बजाय प्रतिलिपि बनाई जानी चाहिए? मेरे लिए थोड़ा सा लगता है।

+0

क्या आप "भर में इसकी नक़ल" के साथ मतलब है है? शीर्षक के लिए –

+3

+1।मैं अब से सहकर्मी समीक्षा के दौरान * सामाजिक रूप से स्वीकार्य * कहने जा रहा हूं। – Renan

+0

@ हेनकहोल्टरमैन, जैसा कि 'आने वाली धारा का उपयोग करने से पहले' स्ट्रीम, कॉपी (कॉपी); 'उदाहरण के लिए। –

उत्तर

10

क्या यह स्थिति की जांच करने और इसे शुरू करने के लिए रीसेट करने का तरीका है, बशर्ते कि CanSeek इसका उपयोग करने से पहले सच हो?

नहीं, उस स्थिति में मैं कॉलिंग कोड को स्ट्रीम को सही तरीके से तैयार करने की अपेक्षा करता हूं।

विधियों पर स्ट्रीम साझा करने वाले सबसे आम पैटर्न की आवश्यकता होती है कि अंतिम पढ़ने/लिखने के बाद पॉइंटर को छोड़ दिया जाए, इसलिए यह कभी भी ज्यादा नहीं आता है।

लेकिन के बाद सबसे अच्छी बात यह है कि: कुछ भी नहीं करें।

3

क्या यह स्थिति की जांच करने और इसे शुरू करने के लिए रीसेट करने का तरीका है, बशर्ते कि कैनसेक इसका उपयोग करने से पहले सच हो?

नहीं है, दो कारणों के लिए:

  • यह हमेशा संभव नहीं है (उदाहरण के लिए यदि CanSeek गलत है), इसलिए यदि आप इसे कुछ धाराओं के लिए किया था और दूसरों के लिए नहीं यह अजीब होगा
  • बीसीएल कक्षाएं ऐसा नहीं करती हैं। उदाहरण के लिए, StreamReader निपटाए जाने पर अंतर्निहित धारा को बंद कर देता है, यह इसे अपने पिछले राज्य में पुनर्स्थापित नहीं करता है।
+0

यह दिलचस्प है क्योंकि धारा स्ट्रीमर 'स्ट्रीम को बंद करने के लिए तर्कसंगत रूप से ऐसा करने की ज़िम्मेदारी नहीं है, और 0 को रीसेट करने से भी बदतर देखा जा सकता है। –

+0

स्ट्रीम रीडर डिजाइन पर बहुत चर्चा की गई है, यह बहस योग्य है। इसे रोकने के लिए रैपर हैं। –

0

मैं सवाल को अद्यतन करने के बाद से लोग पहले से ही वोट डाले है नहीं करना चाहता था, लेकिन इस भाग :)

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

तो यदि एपीआई के लिए Stream तैयार करने की एप्लिकेशन की ज़िम्मेदारी है (और ऐसा लगता है कि हम सभी सहमत हैं), तो हम ऐप के भीतर एक विस्तार विधि में सहायक तर्क को 'लिफ्ट' कर सकते हैं।

/// <summary> 
    /// Tries to set the stream to position 0 if required. 
    /// </summary> 
    /// <returns> 
    /// False if the stream is not at position 0 and does not support seek operations. 
    /// </returns> 
    public static bool TrySetPositionZero(this Stream stream) 
    { 
     if (stream.Position > 0) 
     { 
      if (stream.CanSeek) 
      { 
       stream.Position = 0; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return true; 
     } 
    } 

इस बीच का अंतर और बस stream.Position = 0 यह सफलता का अधिक मौका के बाद से उस पर सफल होगा है कि आगे केवल-धाराओं जब पहले से ही स्थिति में 0.

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

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