Какой правильный бесконечный цикл C#, for (;;) или while (true)? [закрытый]
назад в мои дни C / C++, кодируя "бесконечный цикл" как
while (true)
чувствовал себя более естественно и казалось более очевидным для меня, в отличие от
for (;;)
встреча с PC-lint в конце 1980-х годов и последующие обсуждения лучших практик сломали меня от этой привычки. С тех пор я закодировал петли с помощью for заявление управления. Сегодня, впервые за долгое время, и, возможно, моя первая потребность в бесконечном цикле в качестве разработчика C#, я столкнулся с та же ситуация. Один из них правильный, а другой нет?
22 ответов:
while(true) { }всегда то, что я использовал, и то, что я видел, другие используют для цикла, который должен быть сломан вручную.
компилятор C# преобразует как
for(;;) { // ... }и
while (true) { // ... }на
{ :label // ... goto label; }CIL для обоих одинаковый. Большинство людей находят
while(true)чтобы было легче читать и понимать.for(;;)довольно загадочно.источник:
Я еще немного повозился с.NET Reflector, и я скомпилировал оба цикла с "оптимизировать код" на в Visual Studio.
оба цикла компилируются в (с .NET Рефлектор):
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;для действительно бесконечного цикла это команда go-to. =)
в тех ситуациях, когда мне нужен был истинный бесконечный цикл, я всегда использовал
while(true) {...}он, кажется, выражает намерение лучше, чем пустой для утверждения.
лично я всегда предпочитал
for(;;)именно потому, что он имеет нет условие (в отличие отwhile (true)который имеет всегда истинный). Тем не менее, это действительно очень незначительный стилевой момент, о котором я не думаю, что стоит спорить в любом случае. Я еще не видел руководства по стилю C#, которое санкционировало или запрещало любой подход.
лично я предпочитаю
for (;;)идиома (исходя из точки зрения C/C++). Хотя я согласен, чтоwhile (true)является более читаемым в некотором смысле (и это то, что я использовал, когда даже в C/C++), я обратился к использованиюforидиома, потому что:
- он стоит
Я думаю, что тот факт, что цикл не заканчивается (в нормальном режиме) стоит "вызвать", и я думаю, что
for (;;)Это немного больше.
оригинал K&R книга для C, из которой C# может проследить свою родословную, рекомендуется
for (;;) ...для бесконечных циклов. Он однозначен, легко читаем и имеет долгую и благородную историю.
дополнительное соглашение(2017 февраля)
конечно, если вы думаете, что эта циклическая форма (или любая другая форма) слишком загадочна, вы всегда можете просто добавить a комментарий.
// Infinite loop for (;;) ...или:
for (;;) // Loop forever ...
кого волнует. Это не так, если вы наткнетесь на
for(;;)в системе управления версиями вы собираетесь заменить его наwhile(true). Спорить об этом-все равно что спорить о размещении скобок.
Я предпочитаю немного более "грамотный" код. Я гораздо чаще делаю что-то подобное на практике:
bool shouldContinue = true; while (shouldContinue) { // ... shouldContinue = CheckSomething(); }
в качестве альтернативы можно сказать, что наличие бесконечного цикла обычно является плохой практикой в любом случае, так как ему нужно условие выхода, если приложение действительно не работает вечно. Однако, если это для крылатой ракеты, я приму явное условие выхода, возможно, не потребуется.
хотя мне нравится этот:
for (float f = 16777216f; f < 16777217f; f++) { }
Если вы код-гольф, я бы предложил
for(;;). Кроме того,while(true)имеет тот же смысл и кажется более понятным. Во всяком случае, большинство кодеров, скорее всего, поймут оба варианта, так что это не имеет большого значения. Используйте то, что наиболее удобно.
единственная причина, по которой я бы сказал
for(;;)связано с ограничениями CodeDom (в то время как циклы не могут быть объявлены с помощью CodeDom и для циклов рассматриваются как более общая форма как цикл итерации).Это довольно свободная причина, чтобы выбрать это, кроме того, что
forреализация цикла может использоваться как для обычного кода, так и для кода, сгенерированного CodeDom. То есть она может быть более стандартной.как Примечание, Вы можете использовать фрагменты кода, чтобы создать
whileпетли, но весь цикл должен быть фрагмент...
оба они имеют одну и ту же функцию, но люди обычно предпочитают
while(true). Он чувствует себя легко читать и понимать...
любое выражение, которое всегда возвращает true, должно быть в порядке для цикла while.
пример:
1==1 //Just an example for the text stated before true
С точки зрения читабельности кода
while(true)на любом языке, который я чувствую, имеет больше смысла. С точки зрения того, как компьютер видит это, действительно не должно быть никакой разницы в современном обществе очень эффективных компиляторов и интерпретаторов.Если есть какая-либо разница в производительности, я уверен, что перевод на MSIL будет оптимизирован. Вы можете проверить это, если действительно хотите.
Comments