【问题标题】:Is calling MemoryStream.ToArray() dangerous after disposing?处置后调用 MemoryStream.ToArray() 危险吗?
【发布时间】:2011-04-28 05:33:18
【问题描述】:

在下面的代码中,GC 是否有可能清除 MemoryStream 从而导致 ToArray 失败,因为它在 using 语句之外?

private static byte[] getBytes()
{
    MemoryStream ms = null;

    using (ms = new MemoryStream())
    {
        // ...
    }

    return ms.ToArray();
}

【问题讨论】:

    标签: c# stream


    【解决方案1】:

    不,不可能。这样做是安全的 - MemoryStream 保持对字节数组的强引用。

    我会看看能不能找到任何关于保证的文件...

    编辑:有点……

    来自MemoryStream.Close

    一旦流关闭,缓冲区在MemoryStream 上仍然可用。

    诚然,这并不能保证 Dispose,但记录在案的是调用 Stream.Close

    MemoryStream.Dispose(bool)可以然后被覆盖以释放数组,但根据我的经验,这不是,这将是一个突破性的变化。

    【讨论】:

    • 我在文档中没有找到任何内容,但是我们在 Mono 中对此进行了测试,并且代码在这种情况下有效。顺便说一句,无需调用 ms.Close()。
    • 请注意:MemoryStream.Close (msdn.microsoft.com/en-us/library/…) 的 .NET 4.0 文档包含“一旦流具有,缓冲区在 MemoryStream 上仍然可用被关闭了。”陈述。让我想知道他们是否最终改变了行为。
    • @scottmarlowe:这是 Stream.Close 的文档。看起来他们刚刚停止为 MemoryStream.Close 提供“最重要的文档”。改变实际行为会破坏很多代码。
    • @scottmarlowe:是的。基本上,关闭/处置不会对缓冲区做任何事情。他们本可以为 v1.0 做出不同的选择,但现在改变它为时已晚。
    • ToArray 函数 (msdn.microsoft.com/en-us/library/…) 的文档指出“此方法在 MemoryStream 关​​闭时有效。”
    猜你喜欢
    • 2018-10-17
    • 2011-12-31
    • 2018-12-02
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2015-03-08
    相关资源
    最近更新 更多