为什么MemoryStream的位置属性会随着SetLength改变而变得不可变

本文关键字:改变 SetLength 不可变 MemoryStream 位置 属性 为什么 | 更新日期: 2023-09-27 17:55:02

使用System.IO.MemoryStream类有问题。

创建后,如下所示:

var memory = new MemoryStream();

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

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

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

此外,如果使用。将Position属性更改为0调试器或通过添加一行代码,它忽略位置属性仍然是181。因此,

然而,同样在一个简单的单元测试中,这是预期的。

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

嗯,这是最奇怪的。有什么好主意吗?

为什么MemoryStream的位置属性会随着SetLength改变而变得不可变

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

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

. .并跟踪过去对SetLength的调用,调试器显示Length等于181,Position等于0。必须有其他东西影响流对象

其实我已经找到问题所在了。第一条线索是,它只发生在调试器中。

原因是ToString()方法被重写。

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

问题解决了。

谢谢。