我不明白为什么以下代码会产生错误.通常我可以从语言规范中找出问题,但在这种情况下我不理解语言规范.
这不会导致我的代码出现问题,顺便说一下,我只是想了解这种语言.
例:
bool success;
try
{
success = true;
}
catch
{
success = false;
}
finally
{
Console.WriteLine(success); // ERROR: Local variable 'success' might not be initialized before accessing
}
Run Code Online (Sandbox Code Playgroud)
这种行为似乎适用于所有版本的C#,但下面的引用来自C#语言规范5.0.
第5.3.3.14节 Try-finally语句
finally块的开头的v的明确赋值状态与stmt开头的v的明确赋值状态相同.
这里"stmt的开头"指的是整个try-finally语句的开头,即就在之前try.
第5.3.3.15节 Try-catch-finally语句
以下示例演示了try语句的不同块(第8.10节)如何影响明确赋值.
static void F() {
int i, j;
try {
goto LABEL;
// neither i nor j definitely assigned
i = 1;
// i definitely assigned
}
catch {
// neither i nor j definitely assigned
i = 3;
// i definitely assigned
}
finally {
// neither i nor j definitely assigned
j = 5;
// j definitely assigned
}
// i and j definitely assigned
LABEL:;
// j definitely assigned
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么success(在我的例子中)或i(在语言规范示例中)在finally块的开头没有明确分配?
原因很简单 - 在块之前,无法保证块try或catch块中的代码能够执行finally.
ThreadAborttry块内部可能发生异常,但在赋值执行之前.
运行时代码在抛出异常之后但在catch块中的代码执行之前执行(搜索异常处理在.Net中的工作方式或"结构化异常处理").
因此,在执行finally块之前,try和catch块中的代码可能永远不会执行.
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |