C# using 语句如何转换为 try-final

本文关键字:转换 try-final using 语句 何转换 | 更新日期: 2023-09-27 18:32:53

我试图解决这个问题。 根据此页面关于Using声明:

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

但是在这个关于Try-Finally块的页面上,它指出:

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

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

C# using 语句如何转换为 try-final

它确实表现得像一个尝试/最终 - 所以如果应用程序终止,资源可能不会被释放......这通常没问题,因为通常处置是为了释放流程持有的资源......操作系统无论如何都会在进程死亡时整理这些。(这并不是说不会调用Dispose方法...它与普通try/finally相同。

显然,如果您在文件系统上有一个"锁定文件"或类似的东西,那将是一个问题 - 但是面对断电等,您会遇到同样的问题。

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

如果异常展开仅以未处理的异常结束,导致程序崩溃,则最终块不会在执行停止时运行。

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