2009-12-23 14 views
5
try 
{... 
block: 
.... 
} 
catch{ ..} 
GOTO block 
... 
.... 
finally{...} 

Goto si esegue in questo caso ??Istruzione GOTO in C# .NET

+1

perché dovresti volerlo? – Pondidum

+1

'C# .NET', bello ... –

+2

Non è un errore di compilazione? – ironic

risposta

13

Non verrà compilato a causa di 'GOTO block' invece di 'goto block;' e anche se era giusto non si compila causa C# Specifiche stati (§8.9.3):

L'obiettivo di a gotoidentifier statement è l'istruzione etichettata con l'etichetta data. Se un'etichetta con il nome specificato non esiste nel membro della funzione corrente o se l'istruzione goto non rientra nell'ambito dell'etichetta, si verifica un errore in fase di compilazione. Questa regola consente l'utilizzo di un'istruzione goto per trasferire il controllo da un ambito nidificato, ma non da a nell'ambito nidificato.

Inoltre ho trovato paio di specifiche interessante anche per me:

Una dichiarazione goto non può uscire da un blocco finally (§8.10). Quando si verifica un'istruzione goto all'interno di un blocco finally, la destinazione dell'istruzione goto deve trovarsi all'interno dello stesso blocco finally o in caso contrario si verifica un errore in fase di compilazione.

E:

Un'istruzione goto viene eseguita come segue:

  • Se goto esce uno o più blocchi try con blocchi associati infine,> controllo viene inizialmente trasferito al infine blocco della dichiarazione di prova più interna. Quando> e se il controllo raggiunge il punto finale di un blocco finale, il controllo viene trasferito al blocco> finally della successiva istruzione try allegata. Questo processo viene ripetuto finché non sono stati eseguiti i> blocchi finali di tutte le dichiarazioni di prova intervenienti.
  • Il controllo viene trasferito alla destinazione dell'istruzione goto.

quest'ultimo significa che se si dispone di

try 
{ 
    ... 
    goto Label1; 
} 
finally 
{ 
    CloseAll(); 
} 

Label1: 
    MethodB(); 

chiamerà CloseAll() prima realmente di trasferire il controllo al Label1 e l'esecuzione MethodB().

Ha perfettamente senso, ma non ci ho mai pensato ...

+0

il goto non si verifica nel blocco finale – Fortega

+0

@Fortega: il mio male, ho aggiornato la mia risposta – Regent

+0

@Regent In realtà avevo non concentrato sulla sintassi .. ottengo quello che voglio dalla tua risposta Grazie – Kiran

6

N. blocco: l'etichetta deve essere al di fuori del tentativo per consentire al goto di vederlo. Il codice non verrà nemmeno compilato. Stai facendo un test :)?

+0

Nessun uomo, attualmente mi fa una domanda del genere quindi ero confuso quindi ho pensato di fare una domanda qui su Stackoverflow – Kiran

+0

Ho trovato quella lettura di La specificazione della lingua C# è abbastanza illuminante in questi casi :) – Regent

+2

E ovviamente provare il codice in Visual Studio ti darà molte informazioni. –