2013-08-15 4 views
7

APIを設計する場合、または独自のコード内でもStreamを受け入れる場合は、使用する前にCanSeektrueの場合は、位置を確認して最初にリセットする方法がありますか?ストリームを使用した後にストリームを離れるために社会的に受け入れられる方法は何ですか?

もしそうなら、このすべてをStreamクラス自体で行う方法がないのはなぜですか?私はStreamを想定して数回をキャッチされてきた長年の間に

は位置0

の私の方法に来て、それが右のそれを使用した後に可能Streamをリセットするのですか?

また、Streamは常に周囲を渡される代わりにコピーする必要がありますか?私には少し過度に見えます。

+0

であなたは「周りのコピー」とは何を意味しないとき、それは順方向のみに成功しますので、成功のより多くのチャンスが流れているということでしょうか? –

+3

+1。私は今からピアレビューで*社会的に受け入れられると言うつもりです。 – Renan

+0

@HenkHolterman例えば、着信ストリームを使用する前に、 'stream.CopyTo(copy);'のように。 –

答えて

10

CanSeekを使用する前に、その位置を確認してCanSeekが真である場合は、それをリセットするのはあなたの方法ですか?

いいえ、その場合は、呼び出しコードがストリームを正しく準備することが期待されます。

メソッド上でストリームを共有する最も一般的なパターンでは、ポインタが最後の読み書き後に正確に残っている必要があります。

ただし、には、の後には、何もしないでください。

3

CanSeekを使用する前に、その位置を確認してCanSeekが真である場合は、それをリセットするのはあなたの方法ですか?

いいえ、二つの理由:

  • CanSeekがfalseの場合など)、それは常に可能ではありませんので、あなたが他の人
  • BCLのためのいくつかのストリームとないためにそれをしなかった場合、それは奇妙だろうクラスはそれをしません。たとえば、StreamReaderは、それが配置されているときに下にあるストリームを閉じますが、前の状態に復元しません。再利用可能な設計の際
+0

'StreamReader'でストリームを閉じることは、おそらくそれを行う責任ではなく、0にリセットするより悪いと見ることができます。 –

+0

StreamReaderの設計について多くの議論がありました。議論の余地があります。これを回避するラッパーがあります。 –

0

私はこれは非常に興味深い(感謝)と明らかに人々はすでに投票をしておりますので、質問を更新したくなかったが、この部分に:)

を好きではないことは、思考の違いを示していライブラリスタイルのコードとアプリケーションのコード

したがって、StreamをAPI用に準備するアプリケーションの責任がある場合(それは私たちすべてが同意すると思われます)、有用なロジックをアプリ内の拡張メソッドに「持ち上げる」ことができます。

/// <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

関連する問題