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

C# 为什么MemoryStream Position属性会随着SetLength的变化而变化并变得不可变?,c#,immutability,memorystream,C#,Immutability,Memorystream,使用System.IO.MemoryStream类时出现问题 创建后,如下图所示: var memory = new MemoryStream(); 然后设置要写入的某些字节的长度 var length = 181; memory.SetLength( length); 然后在调试器中,内存显示长度和 将两个位置都设置为181。在单独的简单测试程序中 它属性显示SetLength()之后的位置仍然为零 此外,如果我使用 调试器或通过添加一行代码,它将忽略 并且仍然显示181作为位置属性。就这

使用System.IO.MemoryStream类时出现问题

创建后,如下图所示:

var memory = new MemoryStream();
然后设置要写入的某些字节的长度

var length = 181;
memory.SetLength( length);
然后在调试器中,内存显示长度和 将两个位置都设置为181。在单独的简单测试程序中 它属性显示
SetLength()
之后的位置仍然为零

此外,如果我使用 调试器或通过添加一行代码,它将忽略 并且仍然显示181作为位置属性。就这样 行为就像是不可变的

然而,在一个简单的单元测试中,它仍然可以正常工作

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


这是最奇怪的。有什么好办法吗?

事实上,我已经解决了这个问题。第一条线索是,它只发生在调试器中

原因是ToString()方法被重写

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

问题解决了


谢谢。

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

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

..并跟踪调用
SetLength
,调试器显示
Length
等于181且
Position
等于0。您必须有其他影响流对象的内容。

我们必须同时发布。请看我的回答,我发现了这个bug,它只是在调试期间发生的,因为调试器调用了ToString()方法,而我只希望在将它记录到日志文件时发生。所以修正了。不过我会相信你的回答。你回答得很快,而且是正确的。