Declaración vacía de C #

La especificación del lenguaje C # define la producción de gramática de statement vacía , lo que me permite hacer algo como esto:

static void Main(string[] args) { ; ; ; } 

¿Por qué Microsoft incluiría esta producción de gramática en el lenguaje C #? ¿Tiene un propósito útil?

 while (GetWhitespace(textStream)) ; 

Yo personalmente nunca usaría una statement vacía. Si por algún motivo extraño quería jugar golf de código y escribir algo así como

 while(Foo(x++)) ; 

Estaría más inclinado a usar {} en lugar de; como la “statement de no hacer nada”. Creo que eso es más claro.

Prácticamente está ahí por razones históricas. No hay nada allí que tampoco puedas hacer con {}.

ACTUALIZACIÓN: Pensé en un posible caso de uso. En una comstackción de depuración, le permite colocar un punto de interrupción en algún lugar que le garantice que puede romper y que no tendrá ningún efecto secundario cuando avance. Si el código que rodea el punto de interrupción es particularmente complicado, podría ser útil.

ACTUALIZACIÓN ACTUALIZADA: ESTO ES INCORRECTO INCORRECTO INCORRECTO. Eso no funciona. Simplemente mueve el punto de inflexión a la siguiente statement. Que fastidioso

Aquí hay dos usos:

 while(DoSomething()) ; 

y

 void M() { if(someCondition) goto exit; // ... exit: ; } 

Hay muchos otros Es un dispositivo útil cada vez que no hay nada que hacer, pero se requiere una statement.

C # hereda mucho de la familia C, donde puedes hacer cosas como

 for (i = 0; i < n; v[i++] = 1); 

o

 while (testSomeCondition()); 

Es decir, ejecuta un ciclo con un cuerpo vacío donde la "carne" está dentro de los paréntesis.

Si bien se puede debatir acerca de sus méritos y peligros, estos son lenguajes de progtwigción bastante comunes en el mundo de la progtwigción C, por lo que esta compatibilidad con versiones anteriores hace que sea más fácil para los progtwigdores de C / C ++ / Java aprender C #.

Permite tener bloques de código IFDEF fuera, y el código circundante sigue construyendo. p.ej

 if(true){ #if(DEBUG) System.Console.WriteLine("Debug comment"); #endif } 

que podría escribirse como un bloque vacío, si no te gustan los corchetes:

 if(true) #if(DEBUG) System.Console.WriteLine("Debug comment") #endif ; 

Buenas prácticas o no, algunas personas usan esto:

 while (!SomeCondition) ; // <-- body of the while loop is an empty statement 

¿Por qué Microsoft incluiría esta producción de gramática en el lenguaje C #?

la respuesta principal a esta pregunta es: C # es un lenguaje similar a C y para facilitar la vida de diferentes desarrolladores MS decidió hacer que la mayoría de los elementos de syntax básicos sean compatibles con otros lenguajes similares a c. y es bueno

Esta es una suposición, pero supongo que va a la gramática base para el comstackdor. Relacionándolo para establecer la teoría, el “conjunto vacío” está dentro de cada conjunto. Que el ; realmente es definir un conjunto de operaciones léxicas que siempre debe definir el; que también aceptaría el caso base que es statement vacía.

 if (b1) if (b2) else; else //code 

no con esto esto será doloroso pero esta no es la mejor manera de escribir ifs también. pero aceptable

Eric Lippert es una buena persona para preguntar.

Sobre todo, supongo que es porque no causaría ningún daño y simplificó su manejo de la gramática. Además, ¿por qué restringir a las personas cuando no es necesario?

Por lo que vale, una buena regla general es que deberías haber salido al depurador de cada línea de código que escribes, al menos una vez para cada posible ruta de ejecución.

ref: posible statement vacía errónea

Entonces, un genio podría escribir for(;;) lugar de while(true) . Me gusta para una prueba de entrevista.