Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是为什么;最后";执行?_C#_Exception_Goto_Try Catch Finally - Fatal编程技术网

C# 这是为什么;最后";执行?

C# 这是为什么;最后";执行?,c#,exception,goto,try-catch-finally,C#,Exception,Goto,Try Catch Finally,如果您运行下面的代码,它实际上会在每次调用goto后执行finally: int i = 0; Found: i++; try { throw new Exception(); } catch (Exception) { goto Found; } finally { Console.Write("{0}\t", i); } 为什么?为什么您希望它不会执行 如

如果您运行下面的代码,它实际上会在每次调用goto后执行finally:

    int i = 0;
Found:
    i++;
    try
    {
        throw new Exception();
    }
    catch (Exception)
    {
        goto Found;
    }
    finally
    {
        Console.Write("{0}\t", i);
    }

为什么?

为什么您希望它不会执行

如果有try/catch/finally或try/finally块,那么无论try或catch块中有什么代码,finally块都会执行

<> P>而不是Goto,考虑“返回”。p>
//imagine this try/catch/finally block is inside a function with return type of bool. 
try
{
    throw new Exception();
}
catch (Exception)
{
    return false; //Let's say you put a return here, finally block still executes.
}
finally
{
    Console.WriteLine("I am in finally!");
}

那是故意的。在异常处理程序中,可以执行一些特定于异常的操作。在finally块中,您应该执行资源清理-这就是为什么无论异常处理代码是什么,finally块总是被执行。

似乎是合理的。始终在
try
catch
之后运行
finally

同样地

try
{
  // do something
  return;
}
finally
{
  // do something else
}

将始终运行
finally
块。编辑-但请参见上面Eric的评论。

因为在退出
try
(或捕获异常时执行
catch
)后,将执行
finally
语句。这包括您拨打goto电话的时间。

以下文本来自C语言规范()


goto语句执行如下:

  • 如果goto语句退出一个或多个带有关联finally块的try块,则控制权最初会转移到最内层try语句的finally块。当控件到达finally块的端点时,控件将转移到下一个封闭try语句的finally块。重复此过程,直到执行了所有中间try语句的最后一个块
  • 控件被转移到goto语句的目标

正如人们所提到的,
最终运行时,无论程序流程如何。当然,
finally
块是可选的,因此,如果您不需要它,就不要使用它。

给出的答案的要点是:当控件通过任何方式离开保护区域时,无论是“返回”、“转到”、“中断”、“继续”还是“抛出”,都会执行“finally”。然而,我注意到,几乎每个答案都说“最终块总是运行”最终块并不总是运行。在许多情况下,最终块不运行


谁想把它们都列出来

这是
最后一个
块的点。它总是执行(相当多)。

-1对于使用GOTOI,在生产代码中没有这样做。这只是一个假想的情况。否决投票的主要原因是:我认为这是一个没有意义的问题,在获得超过4k分之后!!!对不起……:)现在你知道答案了,你可以解决这个难题了:给我写一个程序,其中有一个可达的goto,指向一个不可达的标签。-1用于使用goto,真的吗?这一点也不愚蠢。如果你有一个“返回真值”会发生什么在finally块中(对照上面的示例代码)。你得到了什么回报?false还是true?@Pure.Krome,你不能将返回语句放在finally块中。@Pure.Krome,正如Jonathon Watney所说,你会得到一个“编译器错误CS0157:控件不能离开finally子句的主体”。你们也可以看看Eric Lippert的博客文章。我就是从这里得到这个问题的。根据规范,指向SO问题的链接似乎已失效“当控件离开try语句时,始终执行finally块的语句。无论控制传输是作为正常执行的结果发生,还是作为执行break、continue、goto或return语句的结果发生,或者作为从try语句传播异常的结果发生,都是如此。“然而,我认为StackOverflowException就是其中之一,因为据我所知,没有任何东西可以处理它。科林,事实上,关键点是控件何时离开。如果控件没有离开,那么finally块就不会执行!例如,try保护区域可能包含一个无限循环。@Eric:我完全从你的博客文章中了解到这个问题。我也没有考虑try/catch blockEnvironment中的无限循环;OutOfMemoryException和OutOfMemoryException都将避免运行Finally块。@neilwhitaker1:当这些事情发生时,控件真的离开Finally块了吗,还是干脆就死掉了?如果不先执行finally块,控制就不会进入finally块之外的任何地方,除非操作系统杀死或接管线程,并将“控制流”的概念抛到窗外,那该怎么说呢?