using(...) 语句是 try{} finally {} 的语法糖。
但是,如果我有如下的 using 语句:
using (FileStream fs = File.Open(path))
{
}
现在我想捕获打开此文件可能导致的异常(这是相当高风险的代码,因为它可能由于环境而失败),但是如果我在里面写 try-catch 会不会是重复?当代码被编译为 IL 时,我假设当代码被 JITted 时重复将被删除?
但是,我想捕获打开文件可能导致的异常(因此我应该将 try-catch 包装在 using 语句的范围之外),以及我在 using 块内执行的任何操作的异常,因此我应该添加 try-catch块内。
这似乎是我在 CLR 内部可能执行的操作中添加了很多重复内容。CLR 是否添加了 catch 子句?
我的同事认为 using 语句很混乱(但这是因为我对它们进行了硬编码,因为我需要非常快速地更改它们并且无法访问代码库的其他部分,因此单行稍长)。说同事不使用 using 语句,但是 using 语句和 try-finally/try-catch-finally 之间是否存在任何功能差异?我确实看到了一个案例,其中 WCF 服务有一个不为人知的关于使用 finally 和返回值(关于 finally)的极端案例。解决方案是使用检查块。C#中有这样的东西吗?
另一方面,是否所有实现 IDisposale 非托管资源所有者的类型?与我朋友的讨论指出答案是否定的。(我也在这个论坛的使用部分阅读了一些主题,那里有一些非常好的知识)。