Goto vs Рекурсия
У меня есть метод, в это методе я сначала использовал рекурсию, но решил перейти на циклы или goto, перешёл на goto(да да, я знаю, что это плохо:) ), так как ключевое слово continue было уже занято вложенным циклом.
Я хотел бы узнать может из-за goto переполнится стек как из-за рекурсии? Или после перехода с помощью goto стек освобождается от памяти которая занята в метке?
Ответы (1 шт):
Сперва ответ на вопрос: нет, стек не может переполниться из-за использования goto.
В частности, потому, что в C# переход невозможен на метку вне области (scope) видимости.
Подробности в спецификации: The goto statement.
Теперь пофилософствуем. Какие есть способы решения проблемы - выход из нескольких вложенных циклов? Собственно, они уже были перечислены автором и комментаторами:
- Переход на метку с помощью
goto - Использование дополнительного булева флага
- Применение дополнительного метода, куда выносится вложенный цикл
Примеры здесь.
В некоторых языках программирования есть дополнительные способы выхода из циклов. Например, в Java можно писать continue label.
В других языках можно вводить собственные синтаксические конструкции благодаря макросам. Например, в Nemerle. В нём легко сделать конструкцию как в Java и многое другое. Постепенно из этого языка перетягиваются в C# разные вкусности. Остаётся лишь надеяться, что когда-нибудь и гигиенические макросы возьмут на вооружение.