Какой правильный бесконечный цикл C#, for (;;) или while (true)? [закрытый]



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



while (true)


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



for (;;)


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

919   22  

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, я проверил:)

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

  1. не использовать "for (;;) {} " - Это заставляет заявление плакать.
  2. если, конечно, вы "#define EVER ;;".

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

STARTOVER:  
    //Do something
    goto STARTOVER;

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

Я думаю while (true) немного более читабельным.

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

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). Спорить об этом-все равно что спорить о размещении скобок.

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

Он должен быть!--0--> не while(1), Так что while(1) неверно в C#, да;)

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

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

    shouldContinue = CheckSomething();
}

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

while(true)
{

}

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

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

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

    Ничего не найдено.