0

在我经常使用的一些代码中(并且已经编写了几次),使用了如下代码:

using (StreamWriter sw = new FileWriter(".\SomeFile.txt"))
{
    // Perform file IO here...
}
finally
{
    sw.Close();
}

我熟悉 C# 中的 try/catch/finally ...我知道 finally 的上下文是有效的。当我对“最终使用”一词进行谷歌搜索时,我找不到相关匹配项。

这个 finally 的上下文是否像我想的那样工作,在 Using 语句的最终命令中,Finally 块的内容在哪里被执行?还是我(以及我正在使用的代码库)都错了?最终仅限于 Try/Catch 吗?

4

4 回答 4

1

最终总是运行,但你的代码大部分是多余的。编码:

 using (StreamWriter sw = new FileWriter(".\SomeFile.txt"))
 {
     // Perform file IO here...
 }

在功能上等同于

 {
   StreamWriter sw = new FileWriter(".\SomeFile.txt");
    try {
       // Perform file IO here...
    }
    finally {
       ((IDisposable)sw).Dispose();
    }
 }

StreamWriter 的 Dispose() 方法隐式调用 Close()。然而,这不应该是一个错误,因为用户定义的 finally 在系统隐式 finally 之前运行。

于 2012-07-18T13:55:41.137 回答
1

最终仅限于 Try/Catch 吗?

的。一个finally块之前必须有一个try块。只有catch是可选的。除此之外,您应该阅读一些有关范围的信息。您在块中声明的sw变量在该using块之外不可访问。

此外,一旦块超出范围(即执行该块中的最后一条指令时),using将处理StreamWriterFileWriter来自Java ;-),因此您不必手动丢弃或关闭它。

于 2012-07-18T14:01:36.833 回答
0

finally 总是有效的,是否存在(未捕获的)异常并不重要

于 2012-07-18T13:51:18.437 回答
0

我相信当 ausing转换为IL时- .Net 无论如何都会将 a 转换using为 a try(某种) - 所以在这种情况下它仍然有意义。

见这篇文章。

于 2012-07-18T13:52:34.700 回答