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

Будет ли в этом случае выполнено goto?Оператор GOTO в C# .NET

+1

Зачем вам это нужно? – Pondidum

+1

'C# .NET', nice ... –

+2

Не ошибка компиляции? – ironic

ответ

13

Это не будет компилироваться из-за «GOTO block» вместо «goto block;», и даже если он был прав, он не будет компилироваться, так как спецификации C# состояния (§8.9.3):

Цель a gotoидентификатор statement - это обозначение с указанной меткой. Если метка с заданным именем не существует в текущем члене функции или если оператор goto не входит в область метки, возникает ошибка времени компиляции. Это правило позволяет использовать оператор goto для переноса управления из вложенной области, но не в вложенную область.

Кроме того, я тоже нашел пару Спекуляции мне интересно:

Оператор Goto не может выйти из finally блока (§8.10). Когда оператор goto встречается в блоке finally, цель оператора goto должна находиться в одном блоке finally, иначе возникает ошибка времени компиляции.

И:

Гото оператор выполняется следующим образом:

  • Если оператор Гото выходит один или несколько TRY блоков с ассоциированными наконец блоки,> управление сначала переносится на наконец, блок самого внутреннего утверждения try. Когда> и если управление достигает конечной точки блока finally, управление передается блоку> finally следующего закрывающего оператора try. Этот процесс повторяется до тех пор, пока не будут завершены блоки finally всех промежуточных инструкций try.
  • Управление передается цели оператора goto.

последнее означает, что если у вас есть

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

Label1: 
    MethodB(); 

он будет вызывать CloseAll() перед тем как передача управления на Label1 и выполнение MethodB().

Отличный смысл, но я никогда не думал об этом ...

+0

goto не происходит в блоке finally – Fortega

+0

@Fortega: мой плохой, я обновил свой ответ – Regent

+0

@Regent На самом деле у меня было не сосредоточен на синтаксисе .. Я получаю то, что хочу от вашего ответа Спасибо – Kiran

6

№ блок: ярлык должен быть вне попытки, чтобы перейти, чтобы увидеть его. Код даже не компилируется. Вы принимаете тест :)?

+0

Ни один человек, на самом деле мой frnd не задал мне такой вопрос, поэтому я был в замешательстве, поэтому я подумал задать вопрос здесь, на Stackoverflow – Kiran

+0

. Я обнаружил, что чтение Спецификация языка C# довольно полезна в таких случаях :) – Regent

+2

И, конечно, на самом деле попытка кода в Visual Studio даст вам много информации. –

Смежные вопросы