¿Cuál es el bucle infinito correcto de C#, para (;;) o while (true)? [cerrado]


En mis días de C / C++, codificando un" bucle infinito " como

while (true)

Se sentía más natural y parecía más obvio para mí en comparación con

for (;;)

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

Author: Peter Mortensen, 2009-09-09

22 answers

while(true)
{

}

Es siempre lo que he usado y lo que he visto a otros usar para un bucle que tiene que romperse manualmente.

 107
Author: Adam Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:08:14

El compilador de C# transformará ambos

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

Y

while (true)
{
    // ...
}

Hacia

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

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

Fuente:

Me metí un poco más con . NET Reflector, y compilé ambos bucles con el "Optimizar código" en Visual Studio.

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

Label_0000:
    goto Label_0000;

Las rapaces deberían atacar pronto.

 287
Author: Pierre-Alain Vigeant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-17 21:39:42

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

while(true)
{
   //Do My Loop Stuff
}
 58
Author: RSolberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:49:19

Gasp, use:

while (!false)
{

}

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

while (!false && true)
{
}

Antes de que la gente me grite, todo es el mismo código CIL, revisé :)

 42
Author: Allen Rice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:50

Para repetir un par de viejos chistes:

  1. No uses "for (;;) {}" - hace que la declaración llore.
  2. A menos que, por supuesto, usted " #define EVER ;;".
 35
Author: Ben Blank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:13:59

Si quieres ir a la vieja escuela, goto sigue siendo compatible en C#:

STARTOVER:  
    //Do something
    goto STARTOVER;

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

 24
Author: JohnFx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-17 21:44:42

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

 20
Author: Marplesoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-05 18:36:46

En aquellas situaciones en las que necesitaba un verdadero bucle infinito, siempre he utilizado

while(true) {...}

Parece expresar la intención mejor que un vacío para la declaración.

 10
Author: Michael Petrotta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:08:52

Personalmente, siempre he preferido for(;;)precisamente porque tiene ninguna condición (a diferencia de while (true) que tiene una condición siempre verdadera). Sin embargo, este es realmente un punto de estilo muy menor, que no creo que valga la pena discutir de ninguna manera. Todavía no he visto una guía de estilo C# que obligue o prohíba cualquier enfoque.

 8
Author: Pavel Minaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:14:48

Personalmente prefiero el modismo for (;;) (desde el punto de vista de C/C++). Si bien estoy de acuerdo en que el while (true) es más legible en un sentido (y es lo que usé hace mucho tiempo cuando incluso en C/C++), he recurrido al uso del modismo for porque:

  • se destaca

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

 6
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:17:41

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

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 simplemente agregar un comentario.

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

O:

for (;;)    // Loop forever
    ...
 6
Author: David R Tribble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-17 17:21:54

A quién le importa. No es como si te topas con un for(;;) en el control de código fuente que vas a reemplazarlo con un while(true). Discutir esto es como discutir la colocación del corsé.

 5
Author: Dustin Getz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:47:02

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

 4
Author: me22,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:26:48

Debe ser while(true) no while(1), por lo que {[1] } es incorrecto en C#, sí;)

 4
Author: JRL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-05 18:37:06

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();
}
 2
Author: bobbymcr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:34:27

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

while(true)
{

}
 2
Author: anishMarokey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-17 21:46:42

Alternativamente, se podría decir que tener un bucle infinito es normalmente una mala práctica de todos modos, 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é que no se requiera una condición explícita de salida.

Aunque me gusta este:

for (float f = 16777216f; f < 16777217f; f++) { } 
 1
Author: Chris Chilvers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:30:18

Si estás jugando al golf en código, 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. Usa lo que sea más cómodo.

 1
Author: sobellian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-15 23:55:28

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

Esta es una razón bastante suelta 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 bucle while, pero todo el bucle tendría que ser fragmento...

 1
Author: Mark Synowiec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-17 21:37:05

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

 1
Author: abhinav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-17 21:47:18

Cualquier expresión que siempre devuelva true debería estar bien para el bucle while.

Ejemplo:

1==1 //Just an example for the text stated before 
true
 0
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-09 18:43:57

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

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

 0
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-05 18:38:27