gpt4 book ai didi

c# - 使用语句和 try-catch()-finally 重复?

转载 作者:可可西里 更新时间:2023-11-01 07:44:00 25 4
gpt4 key购买 nike

using(...) 语句是 try{} finally {} 的语法糖。

但是如果我有如下的 using 语句:

using (FileStream fs = File.Open(path))
{


}

现在我想捕获打开这个文件可能导致的异常(这是相当高风险的代码,因为它可能会因环境而失败),但是如果我在里面写 try-catch 会不会重复?当代码被编译为 IL 时,我认为当代码被 JITted 时重复将被删除?

但是,我想捕获打开文件可能导致的异常(所以我应该将 try-catch 包装在 using 语句的范围之外),以及我在 using block 中所做的任何异常,所以我应该添加 block 内的 try-catch。

这似乎是我对 CLR 可能在内部执行的操作添加了很多重复。 CLR 是否添加 catch 子句?

我的同事认为 using 语句很乱(但这是因为我对它们进行了硬编码,因为我需要非常快速地更改它们并且无法访问代码库的其他部分,所以单行代码有点长).这位同事不使用 using 语句,但是 using 语句和 try-finally/try-catch-finally 之间有什么功能上的区别吗?我确实看到过一个这样的案例,其中 WCF 服务有一个不为人知的关于使用 finally 和返回值(关于 finally 的东西)的极端案例。解决方案是使用检查 block 。 C#中有这样的东西吗?

另一方面,是否所有实现 IDisposale 的类型都拥有非托管资源?与我 friend 的讨论指出答案是否定的。 (我也阅读了本论坛使用部分的一些主题,那里有一些非常好的知识)。

最佳答案

如果你真的想处理一些异常,你可以自己实现这个模式。就个人而言,我仍然觉得将 using 包装在 try/catch block 中更简单(更重要的是,更清晰)。

但如果您自己动手,请确保您做对了。 Using block 还会创建一个匿名作用域 block ,以便您的变量更快地符合收集条件。在 Using block 末尾调用的 .Dispose() 方法仅清理非托管资源,因此您的对象持有的任何内存都可能逗留久一点。这不太可能是一个大问题,但值得记住以防万一。

因此,要直接调整模式,您的代码需要看起来更像这样:

{
FileStream fs;
try
{
fs = File.Open(path);

}
catch (FileNotFoundException e) { /* ... */ }
catch (IOException e) { /* ... */ }
catch (Exception e) {/* ... */}
finally
{
if (fs != null) fs.Dispose();
}
}

就我个人而言,我希望看到 Using 得到扩展以支持 CatchFinally block 。由于他们已经在对代码执行转换,因此这似乎不会增加那么多额外的复杂性。

关于c# - 使用语句和 try-catch()-finally 重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1369968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com