Мне было интересно, использует ли кто-нибудь еще синтаксис ключевого слова goto в C # и каковы возможные причины для этого.
Я склонен рассматривать любые утверждения, которые заставляют читателя прыгать по коду, как плохую практику, но задавался вопросом, существуют ли какие-либо вероятные сценарии использования такого синтаксиса?
c#
.net
coding-style
goto
Брайан Скотт
источник
источник
goto
чтобы разорвать цикл и вернуться к начальному утверждению в соответствии с определенным условиемОтветы:
Есть некоторые (редкие) случаи, когда goto действительно может улучшить читаемость. Фактически, документация, на которую вы ссылаетесь, приводит два примера:
Вот пример последнего:
Конечно, есть и другие способы решения этой проблемы, такие как рефакторинг кода в функцию, использование вокруг нее фиктивного блока и т. Д. ( Подробности см. В этом вопросе ). Кстати, разработчики языка Java решили полностью запретить goto и вместо этого ввести помеченный оператор break .
источник
Я помню эту часть
Что-то вроде этого
Обратитесь к этому
источник
Я широко использую его в Eduasync, чтобы показать тип кода, который компилятор генерирует для вас при использовании асинхронных методов в C # 5. Вы увидите то же самое в блоках итераторов.
Однако в "нормальном" коде я не могу вспомнить, когда использовал его в последний раз ...
источник
goto отлично подходит для выхода из многих циклов, в которых break не будет работать должным образом (например, при возникновении ошибок), и, как сказал Краген, goto используется компилятором для генерации операторов switch и некоторых других вещей.
источник
Я не помню, чтобы когда-либо использовал
goto
. Но, возможно, это улучшает намерение цикла forever, из которого вы действительно никогда не хотите выходить (нетbreak
, но вы все равно можетеreturn
илиthrow
):Опять же, простого
while (true)
должно хватить ...Кроме того, вы можете использовать в ситуации, когда вы хотите, чтобы первая итерация цикла начиналась в середине цикла: посмотрите здесь пример.
источник
goto
.. иwhile(true) {..}
не интересно использование ..Компилятор использует
goto
операторы в различных частях сгенерированного кода, например, в сгенерированных типах блоков итераторов (сгенерированных при использованииyield return
ключевого слова - я почти уверен, что сгенерированные типы сериализации XML также имеют несколькоgoto
где-то там операторов.См. Подробности реализации блока итератора: автоматически сгенерированные конечные автоматыПодробнее о том, почему и как компилятор C # это обрабатывает, .
Помимо сгенерированного кода, нет веских причин для использования
goto
оператора в обычном коде - это затрудняет понимание кода и, как следствие, более подвержено ошибкам. С другой стороны, используяgoto
операторов в сгенерированном коде может упростить процесс генерации и обычно нормально, потому что никто не собирается читать (или изменять) сгенерированный код, и нет никаких шансов на ошибку, потому что машина выполняет запись.Смотрите заявление Go-to, считающееся вредным, как аргумент против,
goto
а также классический фрагмент истории программирования.источник
goto
не. Что нужно учитывать.Процессор реализует по крайней мере одну инструкцию перехода, и я уверен, что многие операторы используют их в своей реализации или интерпретации.
Одним из преимуществ использования языков 3-го или 4-го поколения является то, что эти физические детали отделены от нас. Хотя мы должны помнить о законе дырявой абстракции, я думаю, что мы также должны использовать наши инструменты по назначению ( извините ). Если бы я писал код и
goto
идея казалась хорошей, пора было бы провести рефакторинг. Цель структурированного языка - избежать этих «скачков» и создать логический поток в нашей разработке.Я должен избегать использования,
break
но я не могу не заметить преимущества в производительности. Однако, если у меня есть вложенные циклы, которые взаимно необходимыbreak
, пора провести рефакторинг.Если кто-то может предложить использовать
goto
это, кажется, лучше, чем рефакторинг, я с радостью отзову свой ответ.Надеюсь, я не виноват в том, что бросился сюда в « велосипедный навес ». Как говорит Краген, того, что достаточно для Дейкстры, достаточно для меня.
источник
dynamic
объект и пройтись по его графу объектов, который содержит несколько словарей, чтобы перейти к нужным мне значениям. Нет смысла использовать методы, которые имеют параметр,dynamic
но ожидают точной формы объекта. С goto, чтобы разбить несколько слоев и продолжить просмотр коллекции этих объектов. [Мне не принадлежат типы, поэтому я не могу предоставить лучший доступ, так что это отражение или динамическое]Гото никогда не бывает лучше. И continue, break (кроме switch / case), (множественный) return и throw также должны быть сведены к минимуму. Вы никогда не захотите сбежать из середины петли гнезда. Вы всегда хотите, чтобы операторы управления циклом имели все управление циклом. Отступы содержат информацию, и все эти утверждения отбрасывают эту информацию. С таким же успехом можно убрать все отступы.
источник