¿C # permite doble punto y coma? ; si es así, ¿hay alguna forma especial?

Estoy escribiendo una statement y comstack, pero el comstackdor [VS] nunca me dice que puse el punto y coma dos veces.

Esto significa en ASP.NET MVC 3

return Json(mydata);; return Json(mydata); 

Ambos comstackn, pero el primero es incorrecto en el patrón de diseño. ¿Por qué no me dice acerca de los dos puntos y comas?

Si no hay ninguna razón para usar dos puntos y comas, ¿por qué no muestra un error?

Si hay un uso especial de este, muéstreme dónde se requieren dos puntos y comas para escribir un enunciado en C #.

No, nunca se requiere un punto y coma doble. Estoy un poco sorprendido de que el comstackdor no se queje de que sea una statement inalcanzable, pero aparentemente es legal. No hará ningún daño, pero igualmente no es una buena idea.

La statement vacía es válida en todos los lenguajes derivados de C. El uso idiomático más común es en una statement para, por ejemplo:

 for (; ; ) { } 

si su uso es especial, muéstrame dónde se requieren dos puntos y comas para escribir una statement en c #

En el ejemplo anterior, se requieren dos puntos y comas por supuesto.

Eso un doble ;; está permitido, es por razones históricas. Es una resaca de los lenguajes de estilo C (en lo que se basa C #).

C & C ++ tiene el concepto de macros de preprocesador que se reemplazan en el código antes de comstackr el código, por ejemplo, el ejemplo trivial AddAndSquare es una macro, no una función

 #define AddAndSquare(X,Y) (X+Y)*(X+Y) int Foo() { int a = 1, b = 2; return AddAndSquare(a, b); } 

va al comstackdor como

 int Foo() { int a = 1, b = 2; return (A+B)*(A+B); } 

Puede redefinir las macros para que sean diferentes a su definición inicial, también puede redefinirlas para que no existan en absoluto.

Dada una aserción macro #define ASSERT(c) if(!c) throw new AssertionFailedException() puedes tener tu código lleno de declaraciones ASSERT.

 void Foo(int x) { int y = x + 2; ASSERT(y != 0); int z = x / y; . . . . } 

Ahora considere que solo desea las afirmaciones en comstackciones de depuración, pero no en comstackciones de versiones, para la versión redefina la macro para que esté vacía (literalmente #define ASSERT ). Ahora cuando Foo va al comstackdor para una comstackción de lanzamiento, parece que esto

 void Foo(int x) { int y = x + 2; ; int z = x / y; . . . . } 

Ahora hay una statement vacía donde estaba ASSERT, porque puede haber o no una statement allí (dependiendo de la configuración de comstackción), el comstackdor necesita poder manejar una instrucción vacía.

Por qué esta convención se mantuvo en C # donde no hay nada como las macros C , no tengo idea, pero posiblemente porque causa poco o nada de daño.

Yo diría que múltiples ; son eliminados por el comstackdor antes de que comience a analizar el código, por lo tanto, su inalcanzable ; es ignorado por el comstackdor.

Existe una diferencia entre “no hay razón para usarlos” y “no es válido para usarlos”. ¿Por qué el lenguaje debe desperdiciar tiempo y esfuerzo para prohibirte hacer esto cuando es inofensivo?

; – separador de statement. El punto y coma doble contiene instrucción vacía , que no hace nada.

Usando instrucción vacía:

 while (Method()) ; 

O

 void F() { //... if (done) goto exit; //... exit: ; } 

Como puede ver, este comportamiento es correcto. Pero en su ejemplo, tendrá un código inalcanzable con una statement vacía.

Por el momento, no se me ocurre ninguna razón específica para escribir un doble punto y coma. Por lo que sé, Visual Studio solo se queja de los puntos y comas que pueden conducir a un comportamiento no deseado, como el siguiente fragmento de código:

 if (true) ; 

Como el punto y coma es una instrucción vacía, toda la cláusula if se vuelve inútil. Visual Studio se queja de todas esas construcciones (using, for, foreach, etc.) sin corchetes a su alrededor.

Entonces el siguiente código está bien para el VS:

  if (true) { ; } 

El comstackdor de C # no permite ;; entre if and else sin llaves y el comstackdor lanzará el error en el caso siguiente.

 if (condition == true) ; ; else ; 

Error del comstackdor:

 Error CS1513 } expected and one warning "Possible mistaken empty statement" 

Por lo tanto, si elimina un semicolon y semicolon , funcionará perfectamente (o deberá agregar llaves).