Stream.Seek(0、SeekOrigin.Begin)またはPosition = 0


175

ストリームを最初にリセットする必要がある場合(例MemoryStream:)を使用することがベストプラクティスです。

stream.Seek(0, SeekOrigin.Begin);

または

stream.Position = 0;

両方とも正常に動作することを確認しましたが、どちらが正しいか疑問に思いましたか?


1
メモリストリームのコンテンツを返す場合、ToArrayは位置に関係なく機能します
James Kyburz '30

3
回答:最も読みやすいもの。
jgauffin '30

7
私は個人的に好みstream.Position = 0;ますが、@ jgauffinに同意する必要があります。最も読みやすいものを選択するだけで、どちらのソリューションも正常に機能します。
lenniep 2011

回答:


161

絶対位置を設定する場合はPositionを使用し、相対位置を設定する場合はSeekを使用します。どちらも便宜上提供されているため、コードのスタイルと読みやすさに合ったものを選択できます。Positionにアクセスするには、安全に交換できるようにストリームがシーク可能である必要があります。


55
私は相対位置にもプロパティを使用しますstream.Position += 10;。私にはかなり読みやすいようです。
Jon Skeet、2011

6
SeekOrigin.BeginとSeekOrigin.Currentの使用には速度の違いはありますか?
ゴンゾブレイン2013

6
@gonzobrains "戻り値:ストリーム内の新しい位置。最初の参照点とオフセットを組み合わせて計算されます。" 。したがって、組み合わせには、直接ポジションを設定するよりも少しコストがかかります。事実上、それはただの摘み取りを意味するだけです。)))
user808128 2013年

1
@ user808128少なくともその種類のドキュメントの引用ドキュメントは、パフォーマンスの証拠ではありません。そのためのソースコードを参照する必要があります。
ArekBulski

8

両方の方法のソースコードを見て、次のことを確認できます。

コストはほぼ同じです(3つのifといくつかの算術)。ただし、これはのような絶対オフセットにジャンプする場合にのみ当てはまり、以下のようなPosition = 0相対オフセットには当てはまりませんPosition += 0ます。

ただし、ここでは、少数の整数演算およびifsチェックのパフォーマンスについて話していることを覚えておいてください。他の人がすでに指摘したように、有意な/検出可能な違いはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.