GOTO оператор в C # .NET - PullRequest
       12

GOTO оператор в C # .NET

5 голосов
/ 23 декабря 2009
try
{...
block:
....
}
catch{ ..}
GOTO block
...
....
finally{...}

Будет ли в этом случае выполнено ??

Ответы [ 2 ]

14 голосов
/ 23 декабря 2009

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

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

Также я нашел пару интересных характеристик для меня тоже:

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

И

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

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

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

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

Label1:
   MethodB();

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

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

6 голосов
/ 23 декабря 2009

Нет. block: label должен находиться за пределами try, чтобы goto мог его увидеть. Код даже не скомпилируется. Вы проходите тест :)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...