在C#中,为什么在finally块的开头未明确分配变量?

用户名

我不明白为什么以下代码会产生错误。通常我可以从语言规范中弄清楚事情,但是在这种情况下,我不理解语言规范。

顺便说一句,这不会在我的代码中引起问题,我只想了解这种语言。

例:

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块的开头明确分配?

维卡斯·古普塔(Vikas Gupta)

原因很简单-无法保证在执行之前try或之后的代码catch始终执行finally

ThreadAbort异常可能发生在try内部,但是在赋值执行之前。

运行时代码在引发异常之后但在catch块中的代码执行之前执行(搜索.Net或“结构化异常处理”中的异常处理工作方式)。

因此,try and catch块中的代码可能永远不会在执行finally之前执行

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么变量应该在 C 中的新块的开头声明

为什么在ClickHouse中未明确修改设置时会引发“无法在只读模式下修改设置”?

为什么在finally块中更改返回的变量不会更改返回值?

为什么在C中以$开头变量名?

为什么将方法分配给 C# 中的变量?

到目前为止,为什么C ++尚未明确包括整数到字符串的转换?

为什么在 finally 部分重置此变量时,在 try 块中返回变量不会更改返回事物的值?

最终总是在try块中的return之前运行,那么为什么finally块中的更新不影响try块返回的变量的值?

为什么Java stacktrace仅在finally块中返回失败?

为什么JDBC连接需要在finally块中关闭?

为什么不能在实例块中为最终的静态变量分配值?

为什么不能将空代码块分配给Javascript中的变量?

为什么不能在Ruby代码块中重新分配变量?

为什么我们需要指针为Go / C中的变量分配值,而不是C#/ Java中的指针

为什么在方法或除C#中的类之外的任何块中都不允许使用公共变量?

在Kotlin中明确指定类型与未明确指定类型之间有什么区别?

属性“ form”没有初始化程序,并且在构造函数中未明确分配

Vue Prop没有初始化程序,并且在构造函数中未明确分配

属性“ ...”没有初始化程序,并且在构造函数中未明确分配

为什么finally块中的return语句否定了except块中的raise?

将文字分配给oracle块中的绑定变量(C#输出参数)

当未明确指定CultureInfo时,为什么ReSharper在Char.ToString()处发出警告?

如果函数未明确使用“ ret”,为什么不返回任何值

为什么在try块中使用return仍要执行finally块中的语句

未明确初始化C ++全局变量时发出警告?

为什么在Kotlin中我以0开头的变量?

为什么变量可以在Julia宏名称修饰中以#开头?

在finally块上使用未分配的局部变量

为什么我的代码中已明确定义了未定义的变量,为什么呢?