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