Каковы практические различия между while (true) и for (;;)? - PullRequest
0 голосов
/ 09 сентября 2010

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

Ответы [ 3 ]

7 голосов
/ 09 сентября 2010

Без разницы. Я проверил IL. Я написал две функции следующим образом.

class Program
{
    static void Main(string[] args)
    {
        System.Console.ReadLine();
    }

    static void EndlessWhile()
    {
        while (true)
        {
            Console.WriteLine("Hello");
        }
    }

    static void EndlessFor()
    {
        for (; ; )
        {
            Console.WriteLine("Hello");
        }
    }
}

// IL of both the functions are mentioned below.

.method private hidebysig static void  EndlessWhile() cil managed
{
  // Code size       20 (0x14)
  .maxstack  1
  .locals init ([0] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  br.s       IL_0010
  IL_0003:  nop
  IL_0004:  ldstr      "Hello"
  IL_0009:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000e:  nop
  IL_000f:  nop
  IL_0010:  ldc.i4.1
  IL_0011:  stloc.0
  IL_0012:  br.s       IL_0003
} // end of method Program::EndlessWhile

.method private hidebysig static void  EndlessFor() cil managed
{
  // Code size       20 (0x14)
  .maxstack  1
  .locals init ([0] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  br.s       IL_0010
  IL_0003:  nop
  IL_0004:  ldstr      "Hello"
  IL_0009:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000e:  nop
  IL_000f:  nop
  IL_0010:  ldc.i4.1
  IL_0011:  stloc.0
  IL_0012:  br.s       IL_0003
} // end of method Program::EndlessFor
1 голос
/ 09 сентября 2010

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

1 голос
/ 09 сентября 2010

Возможно просто стилистически.

Я смутно помню, как в прошлом компилятор C ++ давал мне предупреждение для while(true), но не для for(;;)

Это, вероятно, то место, откуда изначально пришел стиль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...