我有以下代码
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
The dispose()
方法在末尾调用using
声明大括号}
正确的?自从我return
结束之前using
声明,将MemoryStream
对象是否得到妥善处置?这里会发生什么?
Yes, Dispose
将被调用。一旦执行离开范围,它就会被调用using
块,无论以什么方式离开该块,无论是该块的执行结束,return
声明或异常。
正如@Noldorin 正确指出的那样,使用using
代码中的块被编译成try
/finally
, with Dispose
被称为在finally
堵塞。例如下面的代码:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
实际上变成:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
所以,因为finally
保证在之后执行try
块已完成执行,无论其执行路径如何,Dispose
无论如何,都保证会被调用。
有关更多信息,请参阅这篇 MSDN 文章.
附录:
只是要补充一点警告:因为Dispose
保证被调用,确保它几乎总是一个好主意Dispose
实现时永远不会抛出异常IDisposable
。不幸的是,核心库中有一些类do在某些情况下抛出Dispose
叫做——我在看着你,WCF 服务参考/客户端代理! ——当这种情况发生时,如果Dispose
在异常堆栈展开期间调用,因为原始异常被吞没,有利于由异常堆栈生成的新异常Dispose
称呼。这可能会让人非常沮丧。或者这令人沮丧、疯狂?两者之一。也许两者都有。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)