由于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)?
答案 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安全漏洞:)开玩笑:))