Stream.Seek(0,SeekOrigin.Begin)或Position = 0


175

当您需要将流重置为开始(例如MemoryStream)时,最好使用

stream.Seek(0, SeekOrigin.Begin);

要么

stream.Position = 0;

我看过两者都工作正常,但想知道一个是否比另一个更正确?


1
如果要返回内存流的内容,则ToArray不管位置如何都可以工作
James Kyburz 2011年

3
答:最易读的一种。
jgauffin

7
我个人更喜欢,stream.Position = 0;但我必须同意@jgauffin,只需选择可读性最强的两种解决方案即可。
lenniep 2011年

Answers:


161

设置绝对位置时,请使用“位置”;在设置相对位置时,请使用“搜索”。两者都是为了方便起见而提供的,因此您可以选择适合代码样式和可读性的一种。访问排名要求信息流是可搜索的,因此可以安全地互换。


55
我甚至将该属性用于相对位置:stream.Position += 10;对我来说似乎很可读。
乔恩·斯基特

6
使用SeekOrigin.Begin和SeekOrigin.Current之间有速度差异吗?
gonzobrains

6
“ @gonzobrains ”返回值:通过组合初始参考点和偏移量而计算出的流中的新位置。。因此,合并的成本要比直接设置位置高得多。实际上,这只是挑剔。)))
user808128

1
@ user808128引用文档(至少是此类文档)不是性能的证明。您应该参考源代码。
ArekBulski

8

您可以查看两种方法的源代码以找出:

代价几乎是相同的(3个if和一些算术)。但是,这仅适用于跳转到绝对偏移量(Position = 0而不是相对偏移量)Position += 0)的情况,在这种情况下,Seek似乎稍微好一些。

但是,请记住,我们在谈论的是少数整数定律和ifs检查的性能,这就像使用基准测试方法无法准确测量一样。就像其他人已经指出的那样,没有显着/可检测的差异。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.