Существует несколько допустимых вариантов использования goto в .NET (в частности, C #):
Симуляция аварийного переключения оператора имитации переключения .
Те, что происходят из фона C ++используются для написания операторов switch, которые автоматически переходят от случая к случаю, если явно не завершены с помощью break.Для C # только тривиальные (пустые) падежи.
Например, в C ++
int i = 1;
switch (i)
{
case 1:
printf ("Case 1\r\n");
case 2:
printf ("Case 2\r\n");
default:
printf ("Default Case\r\n");
break;
}
В этом коде C ++ вывод:
Case 1
Case 2
Default Case
Вот аналогичный код C #:
int i = 1;
switch (i)
{
case 1:
Console.Writeline ("Case 1");
case 2:
Console.Writeline ("Case 2");
default:
Console.Writeline ("Default Case");
break;
}
Как написано, это не скомпилируется.Есть несколько ошибок компиляции, которые выглядят так:
Control cannot fall through from one case label ('case 1:') to another
Добавление операторов goto заставляет его работать:
int i = 1;
switch (i)
{
case 1:
Console.WriteLine ("Case 1");
goto case 2;
case 2:
Console.WriteLine("Case 2");
goto default;
default:
Console.WriteLine("Default Case");
break;
}
... другое полезное использование goto в C # - это ...
Бесконечные циклы и развернутая рекурсия
Здесь я не буду вдаваться в подробности, поскольку это менее полезно, но иногда мы пишем бесконечные циклы, используя конструкции while(true)
, которые явнозавершается break
или повторно выполняется с оператором continue
.Это может произойти, когда мы пытаемся смоделировать вызовы рекурсивных методов, но не имеем никакого контроля над потенциальной областью действия рекурсии.
Очевидно, что вы можете преобразовать это в цикл while(true)
или преобразовать его в отдельныйметод, но также использование метки и оператора goto работает.
Такое использование goto является более спорным, но все же стоит помнить о нем как об одном из вариантов в очень редких случаях.