我不明白为什么以下代码会产生错误。通常我可以从语言规范中弄清楚事情,但是在这种情况下,我不理解语言规范。
顺便说一句,这不会在我的代码中引起问题,我只想了解这种语言。
例:
bool success;
try
{
success = true;
}
catch
{
success = false;
}
finally
{
Console.WriteLine(success); // ERROR: Local variable 'success' might not be initialized before accessing
}
此行为似乎在所有C#版本中都是正确的,但是下面的引号来自C#语言规范5.0。
第5.3.3.14节“最终尝试”语句
v在finally-block开头的确定分配状态与v在stmt开头的确定分配状态相同。
这里“ 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
}
谁能解释一下success
(在我的示例中)或i
(在语言规范示例中)为什么未在finally块的开头明确分配?
原因很简单-无法保证在执行块之前try
或之后的代码catch
将始终执行finally
。
ThreadAbort
异常可能发生在try
块内部,但是在赋值执行之前。
运行时代码在引发异常之后但在catch
块中的代码执行之前执行(搜索.Net或“结构化异常处理”中的异常处理工作方式)。
因此,try and catch块中的代码可能永远不会在执行finally
块之前执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句