【问题标题】:MemoryStream must be explicitely be disposed?MemoryStream 必须明确处理?
【发布时间】:2010-11-16 15:27:05
【问题描述】:

由于 MemoryStream 是非托管资源,它是否总是必须被释放?

给定:

1) A method is invoked.
2) A MemoryStream object is created (MemoryStream ms = new MemoryStream();).
3) An exception occurs and is caught from the invoking classes.

MemoryStream 对象的引用因此丢失。这种情况是否需要 try/finally 块(或 using 语句)?

【问题讨论】:

  • 只是想说倭黑猩猩太棒了。

标签: .net dispose memorystream


【解决方案1】:

一般来说,所有一次性物品都必须被丢弃。

然而,MemoryStream 实际上并不需要被释放,因为它没有任何非托管资源。 (这只是一个byte[] 和一个int
首先它是一次性的唯一原因是它继承了抽象的Stream 类,它实现了IDisposable

请注意,每个其他流都必须被释放。

【讨论】:

  • 不同意你不应该在这种情况下调用 Dispose,虽然它可能不是“需要”的,但它实现了 IDisposable 接口,应该通过 using 或 try/catch/finally 调用因为从理论上讲,实现细节可能会在某些时候发生变化,并且由于您忽略了对接口的尊重,因此您可能会被本可以避免的错误所困扰
  • @Aaron:在这种特殊情况下,这非常不太可能。
  • 同意...但这是关于使行为习惯性的。由于周围没有汽车而不使用转向灯的人正在有意识地考虑行动;这不再是一种习惯行为,他们会在某个时候忘记。
  • @Aaron。是的。这就是为什么我说在这种特殊情况下
  • 补充一点:我敢猜测MemoryStream 实现IDisposable 只是因为它必然派生自实现IDisposableStream。从参考源来看,MemoryStream 的基础似乎确实使用了一些“异步 IO 资源”,因为参考源称它可能会被释放,但基础 Dispose 现在完全是空的。
【解决方案2】:

任何实现 IDisposable 的类型都应该通过 try/catch/finally 块或通过 using 语句显式调用 Dispose

在某些情况下,从技术上讲,MemoryStream 不需要处置,但为了尊重接口并保护自己免受下游更改的影响,仍应调用 Dispose

【讨论】:

    【解决方案3】:

    MemoryStream 实现了IDisposable,所以尽可能使用 using 语句。

    如果不可行,请将其设置为 try/catch/finally 块。

    如果你需要让对象超出你的代码范围(当 using 或 try/catch/finally 不起作用时),实现显式处理就成为调用者的责任。

    【讨论】:

      【解决方案4】:

      请看这里Avoiding Problems with the Using Statement

      查看了 IL 和 using 这样做:

      try
      {
      }finally
      {
      ((System.IDisposable)obj).Dispose();
      }
      

      这意味着除了异常(如果它发生在 try 块)将保留在堆栈中,因此如果您不小心,它可能会使您的应用程序崩溃。

      所以: “因此丢失了对 MemoryStream 对象的引用。这种情况是否需要 try/finally 块(或 using 语句)?” - 一样

      现在非常有趣的是,如果 Dispose 方法由于某种原因失败会发生什么- 你有一个 IE 安全漏洞:) 开玩笑:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-19
        • 2020-03-12
        • 1970-01-01
        • 2010-11-17
        • 2015-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多