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

本文关键字:or Position Begin SeekOrigin Seek Stream | 更新日期: 2023-09-27 18:07:13

当你需要重置流到开始(例如MemoryStream)时,使用

是最佳实践吗?
stream.Seek(0, SeekOrigin.Begin);

stream.Position = 0;

我看到两者都很好,但想知道是否一个比另一个更正确?

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

设置绝对位置时使用Position,设置相对位置时使用Seek。两者都是为了方便而提供的,因此您可以选择适合代码风格和可读性的一种。访问Position要求流是可寻的,因此它们可以安全地互换。

您可以查看这两个方法的源代码来查找:

  • 位置属性
    https://referencesource.microsoft.com/mscorlib/系统/io/memorystream.cs, 320
  • 查找方法
    https://referencesource.microsoft.com/mscorlib/系统/io/memorystream.cs, 482

成本几乎相同(3 if s和一些算术)。然而,这只适用于跳转到像Position = 0这样的绝对偏移量,而不适用像Position += 0这样的相对偏移量,在这种情况下,Seek似乎稍微好一些。

但是,您应该记住,我们谈论的是一些整数运算和if检查的性能,这甚至不能用基准测试方法精确测量。就像其他人已经指出的那样,没有显著的/可检测的差异。

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