2010-11-16 47 views
4

由于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(或使用语句)?

+0

只想说倭黑猩猩是真棒失败会发生什么。 – Dave 2010-11-16 15:29:27

回答

2

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

有这种情况下,在技术上MemoryStream不需要处置,但是为了兑现接口并保护自己不受下游变化的影响Dispose仍然应该被调用。

1

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

当这不可行时,使它成为try/catch/finally块。

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

12

一般来说,所有的一次性物品必须经常处理。

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

请注意,其他流必须处置。

+3

不同意你不应该在这个实例中调用Dispose,虽然它可能不是“需要”的事实是它实现了IDisposable接口,应该通过使用或try/catch/finally来调用,因为实现细节可能在理论上在某些时候改变,因为你忽视了接口,你可以通过一个本来可以避免的错误得到一点点 – 2010-11-16 16:18:02

+2

@Aaron:在这种特殊情况下,这是**高度不可能的。 – SLaks 2010-11-16 16:18:54

+1

同意...但这是关于使行为习惯。那些不使用转弯信号的人因为没有汽车而在意识到这个动作;它不再是一种习惯行为,他们会在某个时候忘记。 – 2010-11-16 16:22:30

-1

看到这里Avoiding Problems with the Using Statement

在IL和using看着做到这一点:

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

这意味着你的流将得到无论配置什么,但例外(如果它发生在 try块)将保持在堆栈中,因此如果您不小心,可能会导致应用程序崩溃。

因此: “因此MemoryStream对象的引用丢失了,这种情况是否需要try/finally-block(或using-statement)?” - 它同样

现在,它真的很有趣,如果Dispose方法对于一些reason- 你有一个IE浏览器的安全漏洞:) :)开玩笑