2016-10-31 2 views
-4

Ich bin besonders bewusst von C# Reference und analysiert haben, warum kann ich nicht goto Anweisung in endlich Blöcke verwenden, aber ich frage mich, wenn ich das gleiche Ding mit Methoden versuchen bin ich endlich in der Lage zu lass den finally block aber laut spezifikation muss ich nicht. Ist nicht die goto moo und static void moo() die gleiche Handlung, d. H. Mich aus dem Endblock zu nehmen ?? Also warum in ersten Fall es funktioniert nicht aber reibungslos in Sekunde Fall?goto vs Methode in endlich blockieren in C#

Es ist ein Fehler bei der Kompilierung für eine Anweisung "break", "continue" oder "goto", um die Steuerung aus einem finally-Block zu übertragen. Wenn eine Anweisung "break", "continue" oder "goto" in einem finally-Block auftritt, muss sich das Ziel der Anweisung im selben finally-Block befinden oder andernfalls tritt ein Fehler bei der Kompilierung auf.

Es ist ein Fehler bei der Kompilierung, dass eine return-Anweisung in einem finally-Block auftritt.

Erster Fall mit Goto-Anweisung.

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

Zweiter Fall mit Methoden: es funktioniert!

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

Gibt es * irgendeinen * guten Grund, warum du 'goto' benutzen willst? Die zwei Schnipsel haben nichts gemeinsam. Die zweite ruft eine Methode auf. Der erste Versuch, unkontrolliert aus dem Ausnahme-Finalizer auszubrechen –

+0

Was genau wollen Sie erreichen? Sie gelangen zu Console.Write ohne den goto. – PaulF

+0

Siehe die [akzeptierte Antwort hier] (http://stackoverflow.com/questions/1952306/goto-statement-in-c-net), gemäß der C# -Spezifikation "Eine goto-Anweisung kann einen finally-Block nicht beenden (§8.10) Wenn eine goto-Anweisung innerhalb eines finally-Blocks auftritt, muss das Ziel der goto-Anweisung im selben finally-Block sein oder andernfalls tritt ein Fehler bei der Kompilierung auf. [Spezifikation ist hier] (https://msdn.microsoft.com/en-us/library/aa664758 (v = vs.71) .aspx), Absatz darüber ist in der Nähe der Unterseite. – Equalsk

Antwort

13

Ist nicht die goto moo und static void moo() heißt die gleiche Handlung tut mir nehmen aus schließlich blockieren?

Nein, absolut nicht.

goto moo würde die Kontrolle aus dem finally Block vollständig übertragen.

moo() ruft nur die Methode auf, aber wenn die Methode zurückkehrt, sind Sie wieder im finally Block.

Wenn Sie eine Console.WriteLine("Still here...") nach Ihrer moo() Methode setzen, werden Sie sehen, dass.

+0

ja, gerade gefunden, dass ich noch hier drucken konnte ... –