Я предпочитаю взаимно вызывающие / рекурсивные функции. Чтобы адаптировать ваш пример:
returnvalue Start() {
return Data();
}
returnvalue Data() {
return Finish();
}
returnvalue Finish() {
…
}
Теоретически, этот может быть полностью встроенным, так что вывод компилятора эквивалентен вашему goto
решению (следовательно, такая же скорость). Реально, компилятор C # / JITter, вероятно, не сделает этого . Но так как решение намного более читабельно (ну, IMHO), я бы заменил его решением goto
только после очень тщательного теста, доказывающего, что оно действительно действительно уступает по скорости, или этот стек происходят переполнения (не в этом простом решении, но в этой задаче встречаются более крупные автоматы).
Даже тогда я бы определенно придерживался решения goto case
. Зачем? Потому что тогда вся ваша грязная паста goto
будет хорошо заключена в блочную структуру (блок switch
), и ваши спагетти не будут портить остальную часть кода, предотвращая Болоньезе.
В заключение : функциональный вариант понятен, но в целом подвержен проблемам. Решение goto
грязное. Только goto case
предлагает наполовину чистое, эффективное решение. Если производительность действительно имеет первостепенное значение (а автомат - горлышко бутылки), перейдите к структурированному варианту goto case
.