C# 为什么MemoryStream Position属性会随着SetLength的变化而变化并变得不可变?
使用System.IO.MemoryStream类时出现问题 创建后,如下图所示: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作为位置属性。就这
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()方法,而我只希望在将它记录到日志文件时发生。所以修正了。不过我会相信你的回答。你回答得很快,而且是正确的。