【问题标题】:Why does MemoryStream Position property change with SetLength and become immutable?为什么 MemoryStream Position 属性会随 SetLength 变化并变得不可变?
【发布时间】:2011-05-05 02:36:03
【问题描述】:

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

创建之后,像这样:

var memory = new MemoryStream();

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

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

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

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

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

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

嗯,这是最奇怪的。有什么想法可以尝试吗?

【问题讨论】:

    标签: c# immutability memorystream


    【解决方案1】:

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

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

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

    【讨论】:

    • 我们一定是同时发帖的。查看我的回答,我发现了这个错误,它只在调试期间发生,因为调试器调用了 ToString() 方法,我只希望在将事物记录到日志文件时发生这种情况。所以修好了。
    • 我会感谢你的回答。你回答得这么快,而且是正确的。
    【解决方案2】:

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

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

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

    问题解决了。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2014-11-20
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 2018-05-19
      • 1970-01-01
      相关资源
      最近更新 更多