using语句是一个try{}finally{}的简写形式。
但如果我有以下这样的using语句:
using (FileStream fs = File.Open(path))
{
}
现在我想捕获打开此文件可能引起的异常(由于环境问题,这是相当高风险的代码),但如果我在内部编写try-catch,那么是否会重复?当代码被编译为IL并JIT时,假设重复将被删除?然而,我想捕获打开文件可能引起的异常(因此应该在using语句的范围之外包装try-catch),以及在using块内所做的任何操作引发的异常,因此我应该在块内添加try-catch。
这似乎会给CLR内部已经处理的事情增加很多重复。CLR是否添加catch子句?
我的同事认为using语句很混乱(但这是因为单行有点长,因为我需要快速更改它们,并且无法访问代码库的其他部分)。该同事不使用using语句,但是在using语句和try-finally / try-catch-finally之间是否存在任何功能差异?我确实看到过一种情况,即WCF服务具有关于使用finally和返回值(大概是finally)的不太知名的边角案例。解决方案是使用检查块。C#中是否有类似的情况?
另外,所有实现IDisposale接口的类型都拥有非托管资源的所有者吗?和我的朋友讨论后发现答案是否定的。(我还阅读了该论坛using部分的一些帖子,那里有很好的知识。)