Vac*_*ano 4 c# exception-handling using-statement
我读过这样的用法:
using (myObject)
{
myObject.DoStuff();
}
Run Code Online (Sandbox Code Playgroud)
可以这样想:
try
{
myObject.DoStuff();
}
finally
{
myobject.Dispose()
}
Run Code Online (Sandbox Code Playgroud)
因此,如果myObejct.DoStuff抛出ExceptionA然后myObject.Dispose()也抛出异常(ExceptionB),那么ExceptionA将丢失.(有关更好的说明,请参阅此处的MSDN示例.)
这是否意味着如果使用块代码中的代码可能抛出异常(大多数代码是正确的?)那么using语句是不好的做法?
Ree*_*sey 19
这是否意味着如果使用块代码中的代码可能抛出异常(大多数代码是正确的?)那么using语句是不好的做法?
没有.
然后myObject.Dispose()也会抛出异常
这确实是你问题的症结所在.
这是这里的"坏习惯". IDisposable.Dispose应该真正设计实现,以便它们不会引发异常,除非在真正无法恢复的情况下.
由于IDisposable实际上是为了释放有问题的资源,因此主要问题应该是确保在大多数情况下不会抛出此实现.使用清理方法抛出会引起很多麻烦 - 这就是为什么using语句不应该与WCF客户端一起使用等的原因.
话虽如此,我认为使用声明本身并不是一种坏习惯.实际上,它往往是一种非常好的做法,因为它避免了一个非常常见的陷阱(在例外情况下缺少一次性资源).
using语句确保IDisposable正确处理实现的类型(也就是说,它是正确实现Dispose模式的语法糖).
他们是非常好的做法.
使用Dispose函数抛出是不好的做法.
这是WCF中的常见问题,其中Dispose()经常抛出异常.有一种方法可以包装一次性使您可以继续获得using()语句的好处,而不会有丢失异常的风险.它基本上吞噬了Dispose期间抛出的任何异常,因此原始异常总是被抛出到更高的上下文.
http://marcgravell.blogspot.com/2008/11/dontdontuse-using.html