为什么MemoryStream Position属性随SetLength而变化并变为不可变?

时间:2011-05-05 02:36:04

标签: c# immutability memorystream

使用System.IO.MemoryStream类时遇到问题。

创建后,如下:

var memory = new MemoryStream();

然后设置要写入的一些字节的长度。

var length = 181;
memory.SetLength( length);

然后在调试器中,内存显示长度和 位置BOTH设置为181.在单独的测试程序中 it属性显示SetLength()后位置仍为零。

此外,如果我使用将Position属性更改为0 调试器或添加一行代码,它会忽略 并且仍然显示181作为位置属性。就这样吧 表现得好像不可变。

然而,再次在简单的单元测试中,这可以按预期工作。

起初,这似乎是一个线程问题 如果MemoryStream不是线程安全的。但在调试器中, 在调用任何此代码之前,我冻结了所有其他线程。 它仍然如上所述失败。

嗯,这是最离奇的。任何想法尝试什么?

2 个答案:

答案 0 :(得分:2)

我看不出和你一样的东西。如果我在Main中使用以下代码创建一个控制台应用程序:

        var x = new MemoryStream();
        x.SetLength(181);

..并追踪调用SetLength,调试器显示Length等于181,Position等于0.你必须还有别的东西影响你的流对象。

答案 1 :(得分:0)

实际上,想出了问题所在。第一个线索是它只发生在调试器中。

原因是覆盖了ToString()方法。

正在读取内存并在调试器中显示它。那是从记忆中读取并因此修改位置。

问题解决了。

感谢。