2011-01-25 45 views
13

Estoy escribiendo una declaración y compila, pero el compilador [VS] nunca me dice que puse el punto y coma dos veces.¿C# permite doble punto y coma? ; si es así, ¿hay alguna forma especial?

Esto significa que en ASP.NET MVC 3

return Json(mydata);; 

return Json(mydata); 

Ambos compilar, pero la primera es malo 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 la misma, muéstreme dónde se requieren dos puntos y comas para escribir una instrucción en C#.

Respuesta

19

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

+2

Por qué sería, es perfectamente alcanzable, solo está vacío – Dyppl

+1

@Stook: ¿Cómo se puede alcanzar después de una declaración de devolución incondicional? Intente poner cualquier otra declaración allí (por ejemplo, una declaración de variable) y el compilador da una advertencia. –

+0

oh lo siento, no le presté suficiente atención a un ejemplo real, mi mal. – Dyppl

1

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

if (true) 
    ; 

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

Así que el siguiente código está muy bien para el VS:

if (true) 
{ 
     ; 
} 
2

; - separador de declaración. El punto y coma doble contiene empty statement, que no hacen nada.

Usando sentencia vacía:

while (Method()) 
    ; 

O

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

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

6

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

for (; ;) 
{ 
} 

if their is a special use of it then show me where two semicolon is required to write a statement in c#

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

+0

¿Por qué no usar una while (true) loop en su lugar? –

4

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

C & C++ tienen el concepto de macros de preprocesador que se reemplazan en el código antes de compilar el código, p.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 compilador como

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

puede volver a definir las macros sean diferentes a su definición inicial, también puede volver a definir ellos para que don' existe en absoluto.

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

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

Ahora consideran que sólo desea que el afirma en versiones de depuración, pero no en las versiones de lanzamiento, para la liberación se redefine la macro a estar vacío (literalmente #define ASSERT). Ahora, cuando Foo va al compilador para una versión de lanzamiento, parece que este

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

Ahora hay una sentencia vacía donde estaba la aserción, porque no puede o no ser una declaración allí (dependiendo de la configuración de compilación), el compilador necesita poder manejar una declaració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.

Supongo que múltiples múltiplos ; son eliminados por el compilador antes de que comience a analizar el código, por lo tanto, el compilador no tiene en cuenta su ; inalcanzable.

4

Existe una diferencia entre "sin motivo para usarlas" y "no válido para usarlas". ¿Por qué el lenguaje debe desperdiciar tiempo y esfuerzo para prohibirte hacer esto cuando es inofensivo?

0

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

if (condition == true) 
       ; ; 
      else 
       ; 

error del compilador:

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

Así que si se quita uno semicolon que funcione a la perfección (o es necesario agregar las llaves).

+1

'if (int.Parse ("1") == 1) { \t \t \t; \t \t} \t \t; \t \t else { \t \t \t \t \t} '---- Esto es lo que su código es. El problema es algo más aburrido, tienes un 'else' sin un' if' asociado. El ';' podría ser cualquier declaración aquí. –

Cuestiones relacionadas