当你需要重置一个流到开始(例如MemoryStream)是最好的做法使用

stream.Seek(0, SeekOrigin.Begin);

or

stream.Position = 0;

我看到这两种方法都很好,但不知道其中一种是否比另一种更正确?


当前回答

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

其他回答

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

你可以查看这两个方法的源代码来找到答案:

位置属性 https://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs,320 寻求方法 https://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs,482

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

但是,您应该记住,我们讨论的是一些整数算术的性能,如果检查,这甚至不能用基准测试方法准确测量。正如其他人已经指出的那样,两者之间没有显著/可检测到的差异。

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