7

由于 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 语句)?

4

4 回答 4

17

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

但是,MemoryStream实际上不需要处置,因为它没有任何非托管资源。(它只是 abyte[]和 an int
首先它是一次性的唯一原因是它继承了抽象Stream类,它实现了IDisposable.

请注意,必须释放所有其他流。

于 2010-11-16T15:31:08.407 回答
3

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

在某些情况下,技术上MemoryStream不需要处理,但是Dispose仍然应该调用接口并保护自己免受下游更改的影响。

于 2010-11-16T15:28:42.870 回答
1

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

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

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

于 2010-11-16T15:29:48.723 回答
-1

请参阅此处避免使用语句出现问题

查看了 IL 并using执行此操作:

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

这意味着您的流无论如何都会被处理,但异常(如果它发生在 try 块中)将保留在堆栈中,因此如果您不小心,它可能会使您的应用程序崩溃。

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

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

于 2010-11-16T15:34:50.217 回答