C#如何使用语句转换为试用终结

时间:2016-02-02 19:19:46

标签: c# exception using try-finally

我正试图绕过这个。根据{{​​1}} Using声明:

  

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果;实际上,这就是编译器如何翻译using语句。

但在this page关于Try-Finally阻止它的情况下:

  

在处理的异常中,保证运行关联的finally块。但是,如果未处理异常,则finally块的执行取决于如何触发异常展开操作。

那么如果Using语句转换为无法保证调用finally语句的Try-Finally,如何保证在发生异常时调用Dispose方法?

3 个答案:

答案 0 :(得分:10)

它的行为确实像try / finally一样 - 所以如果应用程序终止,资源可能不会被处理......这通常是可以的,因为通常处理是为了释放进程持有的资源......和操作系统无论如何都会对过程中的死亡进行整理。 (这并不是说Dispose方法不会被调用......它与普通try / finally相同。)

显然,如果你在文件系统上有一个“锁定文件”或类似的东西,这将是一个问题 - 但是在断电等情况下你会遇到同样的问题。

答案 1 :(得分:5)

程序无法恢复的异常,在这种情况下finally块将不会执行。例如,堆栈溢出异常或内存不足异常。

答案 2 :(得分:0)

如果异常展开仅以一个未处理的异常结束,该异常会导致程序崩溃,那么最终的块不会随着执行的停止而运行。

TL;博士 最后,块仅在成功或处理异常时运行。