Он не будет компилироваться из-за '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()
.
Имеет смысл, но я никогда не думал об этом ...