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

Con*_*oob 163 .net c# stream

当您需要将流重置为开头(例如MemoryStream)时,最佳做法是使用

stream.Seek(0, SeekOrigin.Begin);
Run Code Online (Sandbox Code Playgroud)

要么

stream.Position = 0;
Run Code Online (Sandbox Code Playgroud)

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

gor*_*rdy 146

设置绝对位置时使用位置,设置相对位置时寻找.两者都是为了方便而提供的,因此您可以选择符合代码样式和可读性的选项.访问位置要求流是可搜索的,因此它们可以安全地互换.

  • 我甚至为相对位置使用该属性:`stream.Position + = 10;`对我来说似乎很可读. (51认同)
  • @gonzobrains ["返回值:流中的新位置,通过组合初始参考点和偏移量计算得出."](http://msdn.microsoft.com/en-us/library/system.io.memorystream. seek.aspx).因此,组合成本不仅仅是直接设置位置.实际上它只意味着挑选.))) (6认同)
  • 使用SeekOrigin.Begin和SeekOrigin.Current之间有速度差异吗? (5认同)

tig*_*rou 7

如果您正在处理文件(例如:使用FileStream类),则Seek(0, SeekOrigin.Begin)似乎能够保留内部缓冲区(如果可能),而Position=0将始终丢弃它。


Are*_*ski 6

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

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

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