为什么MemoryStream Position属性会随着SetLength的变化而变得不可变?

问题描述:

使用System.IO.MemoryStream类时出现问题。为什么MemoryStream Position属性会随着SetLength的变化而变得不可变?

创建它,像这样后:

var memory = new MemoryStream(); 

它然后将一些字节的长度写入到它。

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

然后在调试器,存储器示出了长度和 位置都设定为181.在单独的简单测试程序 它属性在SetLength()后零示出的位置不动。

此外,如果我的Position属性更改0使用 调试器或添加一行的代码,它忽略 和仍显示181作为位置属性。因此它 表现得好像不可变。

但是,再次在一个简单的单元测试中,这可以按预期工作。

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

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

我看不到和你一样的东西。如果我创建与主营以下代码控制台应用程序:

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

..和跟踪过去调用SetLength,调试器显示Length到181平等和Position等于0您必须有别的东西影响你的流对象。

+0

我们必须同时发布。看到我的答案,我发现了这个错误,它只是在调试过程中发生的,因为调试器调用了ToString()方法,我只希望在将事件记录到日志文件时发生这种情况。所以修好了。 – Wayne 2011-05-05 03:54:00

+0

虽然我会给你信用回答。你回答得太快而且正确。 – Wayne 2011-05-05 04:01:40

其实,找出问题所在。第一个线索是它只发生在调试器中。

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

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

问题解决。

谢谢。