¿Cuál es el ciclo infinito de C # correcto para (;;) o while (verdadero)?

De vuelta en mis días C / C ++, codificando un “ciclo infinito” como

while (true) 

me sentí más natural y me pareció más obvio que opuesto a

 for (;;) 

Un encuentro con PC-lint a fines de la década de 1980 y posteriores discusiones sobre mejores prácticas me deshizo de este hábito. Desde entonces, he codificado los bucles usando la statement de control. Hoy, por primera vez en mucho tiempo, y tal vez mi primera necesidad de un ciclo infinito como desarrollador C #, estoy enfrentando la misma situación. Es uno de ellos correcto y el otro no?

     while(true) { } 

    Es siempre lo que he usado y lo que he visto que otros usan para un ciclo que debe romperse manualmente.

    El comstackdor C # transformará ambos

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

    y

     while (true) { // ... } 

    dentro

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

    El CIL para ambos es el mismo. La mayoría de las personas encuentran while(true) es más fácil de leer y entender. for(;;) es bastante críptico.

    Fuente:

    Cometí un poco más con .NET Reflector , y compilé ambos loops con el “código de Optimize” en Visual Studio.

    Ambos bucles se comstackn en (con .NET Reflector):

     Label_0000: goto Label_0000; 

    Los raptores deberían atacar pronto.

    Creo que esto puede ser más fácil de leer y definitivamente es el estándar para usar en C #:

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

    Jadeo, use:

     while (!false) { } 

    O como lo señaló Jsight , es posible que desee estar doblemente seguro:

     while (!false && true) { } 

    Antes de que la gente me grite, todo es el mismo código CIL, lo comprobé 🙂

    Para repetir un par de viejas bromas:

    1. No use ” for (;;) {} ” – hace llorar la statement.
    2. A menos que, por supuesto, ” #define EVER ;; “.

    Si quieres ir a la vieja escuela, goto todavía es compatible con C #:

     STARTOVER: //Do something goto STARTOVER; 

    Para un bucle verdaderamente infinito, este es el comando ir. =)

    Creo que while (true) es un poco más legible.

    En esas situaciones en las que necesitaba un verdadero bucle infinito, siempre he usado

     while(true) {...} 

    Parece express intención mejor que una statement vacía.

    Personalmente, siempre he preferido for(;;) precisamente porque no tiene ninguna condición (a diferencia de while (true) que tiene uno siempre verdadero). Sin embargo, este es realmente un punto de estilo muy secundario, que no creo que valga la pena discutir de ninguna manera. Todavía tengo que ver una guía de estilo de C # que impuso o prohibió cualquiera de los enfoques.

    Personalmente prefiero la expresión for (;;) (que viene del punto de vista de C / C ++). Si bien estoy de acuerdo en que el while (true) es más legible en cierto sentido (y es lo que utilicé hace mucho tiempo, incluso en C / C ++), he recurrido al uso del mod for porque:

    • se destaca

    Creo que el hecho de que un ciclo no termine (de manera normal) vale la pena ‘llamar’, y creo que el for (;;) hace esto un poco más.

    El libro original de K & R para C, del cual C # puede rastrear su ascendencia, recomienda

     for (;;) ... 

    para bucles infinitos. Es inequívoco, fácil de leer, y tiene una larga y noble historia detrás.

    Adición (feb 2017)

    Por supuesto, si crees que esta forma de bucle (o cualquier otra forma) es demasiado críptica, siempre puedes agregar un comentario .

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

    O:

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

    A quien le importa. No es como si tropiezas con un for(;;) en el control de fuente lo vas a reemplazar con un while(true) . Argumentar esto es como discutir la colocación de un corsé.

    Sé que en el mundo C ++ Stroustrup aboga por (;;) en TC ++ PL, pero no recuerdo por qué.

    Debería ser while(true) not while(1) , así que while(1) es incorrecto en C #, sí;)

    Prefiero un poco más de código “alfabetizado”. Es mucho más probable que haga algo como esto en la práctica:

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

    Incluso yo también digo que el de abajo es mejor 🙂

     while(true) { } 

    Alternativamente, uno podría decir que tener un bucle infinito normalmente es una mala práctica, ya que necesita una condición de salida a menos que la aplicación realmente se ejecute para siempre. Sin embargo, si esto es para un misil de crucero, aceptaré una condición de salida explícita que podría no ser necesaria.

    Aunque me gusta este:

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

    Si estás jugando al golf, yo sugeriría for(;;) . Más allá de eso, while(true) tiene el mismo significado y parece más intuitivo. En cualquier caso, la mayoría de los codificadores probablemente entenderán ambas variaciones, por lo que realmente no importa. Use lo que sea más cómodo.

    La única razón por la que diría for(;;) es por las limitaciones de CodeDom (mientras que los bucles no se pueden declarar usando CodeDom y los bucles se ven como la forma más general como un bucle de iteración).

    Esta es una razón bastante flexible para elegir esto, aparte del hecho de que la implementación de bucle for se puede usar tanto para el código normal como para el código generado por CodeDom. Es decir, puede ser más estándar.

    Como nota, puede usar fragmentos de código para crear un ciclo while, pero todo el ciclo debería ser un fragmento …

    Ambos tienen la misma función, pero la gente generalmente prefiere while(true) . Se siente fácil de leer y entender …

    Cualquier expresión que siempre devuelve verdadero debería estar bien para while loop.

    Ejemplo:

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

    En términos de legibilidad de código, while(true) en cualquier idioma que siento tiene más sentido. En términos de cómo lo ve la computadora, realmente no debería haber ninguna diferencia en la sociedad actual de comstackdores e intérpretes muy eficientes.

    Si hay alguna diferencia de rendimiento, estoy seguro de que la traducción a MSIL se optimizará. Podrías verificar eso si realmente quisieras.