Каков правильный цикл цикла С#, для (;;) или while (true)?

Назад в мои дни C/С++, кодируя "бесконечный цикл" как

while (true)

чувствовал себя более естественным и казался мне более очевидным, а не

for (;;)

Встреча с PC-lint в конце 1980 года и последующие обсуждения в лучших практиках нарушили эту привычку. С тех пор я кодировал контуры с помощью инструкции управления for. Сегодня, в первый раз за долгое время, и, возможно, моя первая потребность в бесконечном цикле как разработчике С#, я столкнулся с такой же ситуацией. Является ли один из них правильным, а другой нет?

Ответ 1

while(true)
{

}

Я всегда использую то, что я использовал, и то, что я видел, что другие используют для цикла, который должен быть разбит вручную.

Ответ 2

Компилятор С# преобразует как

for(;;)
{
    // ...
}

и

while (true)
{
    // ...
}

в

{
    :label
    // ...
    goto label;
}

CIL для обоих одинаковых. Большинство людей считают, что while(true) легче читать и понимать. for(;;) является довольно загадочным.

Источник:

Я немного перепутал с .NET Reflector, и я скомпилировал оба цикла с помощью "Оптимизировать код" в Visual Studio.

Обе петли собираются в (с .NET Reflector):

Label_0000:
    goto Label_0000;

Raptors должны атаковать в ближайшее время.

Ответ 3

Я думаю, что это может быть проще читать и определенно является стандартом для использования в С#:

while(true)
{
   //Do My Loop Stuff
}

Ответ 4

Гасп, используйте:

while (!false)
{

}

ИЛИ, как указано jsight, вы можете быть уверены в этом:

while (!false && true)
{
}

Прежде чем люди кричат ​​на меня, это все тот же код CIL, я проверил:)

Ответ 5

Чтобы перефразировать пару старых шуток:

  • Не используйте "for (;;) {}" - это заставляет высказывание плакать.
  • Если, конечно, вы не "#define EVER ;;".

Ответ 6

Если вы хотите пойти в старую школу, goto по-прежнему поддерживается в С#:

STARTOVER:  
    //Do something
    goto STARTOVER;

Для действительно бесконечного цикла это команда go-to. =)

Ответ 7

Я думаю, что while (true) немного читаем.

Ответ 8

В тех ситуациях, когда мне нужен был настоящий бесконечный цикл, я всегда использовал

while(true) {...}

Кажется, что выражение лучше, чем пустой оператор.

Ответ 9

Лично я всегда предпочитал for(;;) именно потому, что у него нет условия (в отличие от while (true), который имеет всегда-истинный). Тем не менее, это действительно очень незначительная точка стиля, о которой я не чувствую, стоит спорить о любом из способов. Я еще не видел директивы стиля С#, которая предусматривала или запрещала любой подход.

Ответ 10

Я лично предпочитаю идиому for (;;) (исходя из точки зрения C/С++). Хотя я согласен с тем, что while (true) более читабельен в некотором смысле (и это то, что я использовал, когда даже в C/С++), я обратился к использованию идиомы for, потому что:

  • он выделяется

Я думаю, что тот факт, что цикл не заканчивается (нормальным образом), стоит "вызывать", и я думаю, что for (;;) делает это немного больше.

Ответ 11

Оригинальная K & R для C, из которой С# может отслеживать ее родословную, рекомендуется

for (;;) ...

для бесконечных циклов. Это однозначно, легко читается и имеет за собой долгую и благородную историю.

Добавление (февраль 2017)

Конечно, если вы считаете, что эта циклическая форма (или любая другая форма) слишком загадочна, вы всегда можете просто добавить комментарий.

// Infinite loop
for (;;)
    ...

Или:

for (;;)    // Loop forever
    ...

Ответ 12

Кого волнует. Не нравится, если вы наткнетесь на for(;;) в исходном элементе управления, вы замените его на while(true). Рассуждение это похоже на аргумент размещения скобок.

Ответ 13

Он должен быть while(true) не while(1), поэтому while(1) неверно в С#, да;)

Ответ 14

Я знаю, что в мире С++ Stroustrup выступает за (;;) в TС++ PL, но я не помню, почему.

Ответ 15

Я предпочитаю немного более "грамотный" код. Я гораздо чаще буду делать что-то подобное на практике:

bool shouldContinue = true;
while (shouldContinue)
{
    // ...

    shouldContinue = CheckSomething();
}

Ответ 16

Даже я также говорю, что ниже лучше:)

while(true)
{

}

Ответ 17

Единственная причина, по которой я сказал бы for(;;), - это ограничения CodeDom (в то время как циклы не могут быть объявлены с использованием CodeDom, а циклы рассматриваются как более общая форма как цикл итерации).

Это довольно неприемлемая причина выбора этого, кроме того, что реализация цикла for может использоваться как для обычного кода, так и для кода CodeDom. То есть, это может быть более стандартным.

В качестве примечания вы можете использовать фрагменты кода для создания цикла while, но весь цикл должен быть фрагментом...

Ответ 18

В качестве альтернативы можно сказать, что бесконечный цикл обычно является плохой практикой, так как для него требуется условие выхода, если приложение действительно не работает навсегда. Однако, если это касается крылатой ракеты, я соглашусь, что явное условие выхода может не потребоваться.

Хотя мне это нравится:

for (float f = 16777216f; f < 16777217f; f++) { } 

Ответ 19

Если вы играете в кодовое гольф, я бы предложил for(;;). Кроме того, while(true) имеет тот же смысл и кажется более интуитивным. Во всяком случае, большинство кодеров, вероятно, поймут оба варианта, так что это не имеет большого значения. Используйте то, что наиболее удобно.

Ответ 20

Оба они имеют одинаковую функцию, но люди обычно предпочитают while(true). Легко читать и понимать...

Ответ 21

С точки зрения читаемости кода while(true) на любом языке, который я чувствую, имеет больше смысла. С точки зрения того, как компьютер видит это, на самом деле не должно быть никакой разницы в современном обществе очень эффективных компиляторов и переводчиков.

Если есть разница в производительности, я уверен, что перевод в MSIL будет оптимизирован. Вы можете проверить это, если хотите.

Ответ 22

Любое выражение, которое всегда возвращает true, должно быть ОК для цикла while.

Пример:

1==1 //Just an example for the text stated before 
true