MemoryStream必须明确处理?

时间:2010-11-16 15:27:06

标签: .net dispose memorystream

由于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-block(或using-statement)?

4 个答案:

答案 0 :(得分:16)

通常,必须始终处理所有一次性物品。

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

请注意,必须处理其他所有其他流。

答案 1 :(得分:3)

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

在某些情况下,从技术上讲,MemoryStream不需要处理,但为了尊重界面并保护自己免受下游Dispose的更改仍然应该被调用。

答案 2 :(得分:1)

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

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

如果您需要让对象超出代码范围(当使用或try / catch / finally不起作用时),调用者将负责实现显式处理。

答案 3 :(得分:-1)

请参阅此处Avoiding Problems with the Using Statement

看着IL和using这样做:

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

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

<强>所以: “因此,MemoryStream对象的引用将丢失。这种情况是否需要try / finally-block(或using语句)?” - 它是相同的

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