2016-10-31 72 views
-4

我特别知道C# Reference,并分析了为什么我不能在finally块中使用goto语句,但是我想知道当我使用方法尝试同样的事情时,我终于可以离开最后的块,但根据规范我不能。是不是goto moostatic void moo()做同样的行为,即带我离开最后阻止?那么为什么在第一次的情况下,它不工作,但在第二案件工作顺利?goto vs方法在finally块中c#

对于break,continue或goto语句将控制权转移出finally块是编译时错误。当finally块中发生break,continue或goto语句时,语句的目标必须位于finally块内,否则会发生编译时错误。

对于在finally块中发生的return语句,这是一个编译时错误。

第一个案例与Goto语句。

static void Main(string[] args) 
      { 
       try{} 
       catch (Exception ex){} 
       finally 
       { 
        goto moo; 
       } 
      moo: 
       Console.Write("Hello"); 
      } 

第二种情况与方法:它的工作!

static void Main(string[] args) 
     { 

      try{} 
      catch{} 
      finally 
      { 
       moo(); 
      } 
     } 
     static void moo() 
     { 
      int x=2, y=3, a=4, b=7; 
      if (x == y) 
       return; 
      else 
       a = b; 
     } 
+6

是否有*任何*你想使用'goto'的好理由?这两个片段没有共同之处。第二个调用方法。第一次尝试以不受控制的方式突破异常终结器 –

+0

您究竟想要实现什么?你将无需转到Console.Write。 – PaulF

+0

根据C#规范,请参阅[接受的答案](http://stackoverflow.com/questions/1952306/goto-statement-in-c-net)“goto语句不能退出finally块(§8.10) 。当goto语句出现在finally块中时,goto语句的目标必须位于最后一个块中,否则会发生编译时错误。“ [规范在这里](https://msdn.microsoft.com/en-us/library/aa664758(v = vs.71).aspx),关于此的段落在底部附近。 – Equalsk

回答

13

是不是转到哞和静态无效哞()做同样的动作即带我出去的finally块?

不,绝对不是。

goto moo会将控制权完全转移出finally块。

moo()只是调用方法,但当方法返回时,您又回到finally块中。

如果你在moo()方法后加上Console.WriteLine("Still here..."),你会看到。

+0

是的,只是发现我能够打印仍然在这里... –