Ответ 1
while(true)
{
}
Я всегда использую то, что я использовал, и то, что я видел, что другие используют для цикла, который должен быть разбит вручную.
Назад в мои дни C/С++, кодируя "бесконечный цикл" как
while (true)
чувствовал себя более естественным и казался мне более очевидным, а не
for (;;)
Встреча с PC-lint в конце 1980 года и последующие обсуждения в лучших практиках нарушили эту привычку. С тех пор я кодировал контуры с помощью инструкции управления for
. Сегодня, в первый раз за долгое время, и, возможно, моя первая потребность в бесконечном цикле как разработчике С#, я столкнулся с такой же ситуацией. Является ли один из них правильным, а другой нет?
while(true)
{
}
Я всегда использую то, что я использовал, и то, что я видел, что другие используют для цикла, который должен быть разбит вручную.
Компилятор С# преобразует как
for(;;)
{
// ...
}
и
while (true)
{
// ...
}
в
{
:label
// ...
goto label;
}
CIL для обоих одинаковых. Большинство людей считают, что while(true)
легче читать и понимать. for(;;)
является довольно загадочным.
Я немного перепутал с .NET Reflector, и я скомпилировал оба цикла с помощью "Оптимизировать код" в Visual Studio.
Обе петли собираются в (с .NET Reflector):
Label_0000:
goto Label_0000;
Я думаю, что это может быть проще читать и определенно является стандартом для использования в С#:
while(true)
{
//Do My Loop Stuff
}
Гасп, используйте:
while (!false)
{
}
ИЛИ, как указано jsight, вы можете быть уверены в этом:
while (!false && true)
{
}
Прежде чем люди кричат на меня, это все тот же код CIL, я проверил:)
Чтобы перефразировать пару старых шуток:
for (;;) {}
" - это заставляет высказывание плакать.#define EVER ;;
".Если вы хотите пойти в старую школу, goto по-прежнему поддерживается в С#:
STARTOVER:
//Do something
goto STARTOVER;
Для действительно бесконечного цикла это команда go-to. =)
Я думаю, что while (true)
немного читаем.
В тех ситуациях, когда мне нужен был настоящий бесконечный цикл, я всегда использовал
while(true) {...}
Кажется, что выражение лучше, чем пустой оператор.
Лично я всегда предпочитал for(;;)
именно потому, что у него нет условия (в отличие от while (true)
, который имеет всегда-истинный). Тем не менее, это действительно очень незначительная точка стиля, о которой я не чувствую, стоит спорить о любом из способов. Я еще не видел директивы стиля С#, которая предусматривала или запрещала любой подход.
Я лично предпочитаю идиому for (;;)
(исходя из точки зрения C/С++). Хотя я согласен с тем, что while (true)
более читабельен в некотором смысле (и это то, что я использовал, когда даже в C/С++), я обратился к использованию идиомы for
, потому что:
Я думаю, что тот факт, что цикл не заканчивается (нормальным образом), стоит "вызывать", и я думаю, что for (;;)
делает это немного больше.
Оригинальная K & R для C, из которой С# может отслеживать ее родословную, рекомендуется
for (;;) ...
для бесконечных циклов. Это однозначно, легко читается и имеет за собой долгую и благородную историю.
Добавление (февраль 2017)
Конечно, если вы считаете, что эта циклическая форма (или любая другая форма) слишком загадочна, вы всегда можете просто добавить комментарий.
// Infinite loop
for (;;)
...
Или:
for (;;) // Loop forever
...
Кого волнует. Не нравится, если вы наткнетесь на for(;;)
в исходном элементе управления, вы замените его на while(true)
. Рассуждение это похоже на аргумент размещения скобок.
Он должен быть while(true)
не while(1)
, поэтому while(1)
неверно в С#, да;)
Я знаю, что в мире С++ Stroustrup выступает за (;;) в TС++ PL, но я не помню, почему.
Я предпочитаю немного более "грамотный" код. Я гораздо чаще буду делать что-то подобное на практике:
bool shouldContinue = true;
while (shouldContinue)
{
// ...
shouldContinue = CheckSomething();
}
Даже я также говорю, что ниже лучше:)
while(true)
{
}
Единственная причина, по которой я сказал бы for(;;)
, - это ограничения CodeDom (в то время как циклы не могут быть объявлены с использованием CodeDom, а циклы рассматриваются как более общая форма как цикл итерации).
Это довольно неприемлемая причина выбора этого, кроме того, что реализация цикла for
может использоваться как для обычного кода, так и для кода CodeDom. То есть, это может быть более стандартным.
В качестве примечания вы можете использовать фрагменты кода для создания цикла while
, но весь цикл должен быть фрагментом...
В качестве альтернативы можно сказать, что бесконечный цикл обычно является плохой практикой, так как для него требуется условие выхода, если приложение действительно не работает навсегда. Однако, если это касается крылатой ракеты, я соглашусь, что явное условие выхода может не потребоваться.
Хотя мне это нравится:
for (float f = 16777216f; f < 16777217f; f++) { }
Если вы играете в кодовое гольф, я бы предложил for(;;)
. Кроме того, while(true)
имеет тот же смысл и кажется более интуитивным. Во всяком случае, большинство кодеров, вероятно, поймут оба варианта, так что это не имеет большого значения. Используйте то, что наиболее удобно.
Оба они имеют одинаковую функцию, но люди обычно предпочитают while(true)
. Легко читать и понимать...
С точки зрения читаемости кода while(true)
на любом языке, который я чувствую, имеет больше смысла. С точки зрения того, как компьютер видит это, на самом деле не должно быть никакой разницы в современном обществе очень эффективных компиляторов и переводчиков.
Если есть разница в производительности, я уверен, что перевод в MSIL будет оптимизирован. Вы можете проверить это, если хотите.
Любое выражение, которое всегда возвращает true, должно быть ОК для цикла while.
Пример:
1==1 //Just an example for the text stated before
true