我正试图绕过这个。根据{{1}} Using
声明:
using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果;实际上,这就是编译器如何翻译using语句。
但在this page关于Try-Finally
阻止它的情况下:
在处理的异常中,保证运行关联的finally块。但是,如果未处理异常,则finally块的执行取决于如何触发异常展开操作。
那么如果Using
语句转换为无法保证调用finally语句的Try-Finally
,如何保证在发生异常时调用Dispose方法?
答案 0 :(得分:10)
它的行为确实像try / finally一样 - 所以如果应用程序终止,资源可能不会被处理......这通常是可以的,因为通常处理是为了释放进程持有的资源......和操作系统无论如何都会对过程中的死亡进行整理。 (这并不是说Dispose
方法不会被调用......它与普通try
/ finally
相同。)
显然,如果你在文件系统上有一个“锁定文件”或类似的东西,这将是一个问题 - 但是在断电等情况下你会遇到同样的问题。
答案 1 :(得分:5)
程序无法恢复的异常,在这种情况下finally
块将不会执行。例如,堆栈溢出异常或内存不足异常。
答案 2 :(得分:0)
如果异常展开仅以一个未处理的异常结束,该异常会导致程序崩溃,那么最终的块不会随着执行的停止而运行。
TL;博士 最后,块仅在成功或处理异常时运行。