2010-07-30 8 views
45

He encontrado el siguiente código en C#.¿Demasiado si existen enunciados en C#?

if(condition0) statement0; 
else if(condition1) statement1; 
else if(condition2) statement2; 
else if(condition3) statement3; 
... 
else if(conditionN) statementN; 
else lastStatement; 

Algunos de mis colegas me dicen que esto es una declaración else if. Sin embargo, estoy convencido de que en realidad es una declaración anidada de varias capas if-else. Sé que sin delimitadores {}, se permite una declaración en if o else. Entonces, en este caso, creo que sería equivalente al siguiente código.

if(condition0) 
    statement0; 
else 
    if(condition1) 
    statement1; 
    else 
    if(condition2) 
     statement2; 
    else 
     if(condition3) 
     statement3; 
     else 
     ... 

Tenga en cuenta que todo lo que cambié fue el espacio en blanco. Esta sangría funciona porque cada else vuelve a la instrucción if más reciente cuando no hay delimitadores.

¿Alguien puede aclarar si el formato else if en el primer ejemplo es tratado de manera diferente por el compilador que el formato anidado if-else en el segundo ejemplo?

+7

parece un buen caso para 'cambiar' :) –

+4

@Russ ha! buen juego de palabras! – NickAldwin

+1

[Especificación de idioma] (http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx) lo borra en poco tiempo. Tienes razón, pero parece tener un poco de discusión con el ombligo, cuando no tiene ninguna diferencia práctica :) – shambulator

Respuesta

75

Tiene razón; no hay tal cosa como una declaración "else if" en C#. Es solo otro en el que la declaración de la cláusula alternativa es en sí misma una declaración if.

Por supuesto, IDE trata "else if" como especial para que pueda obtener el buen formato que espera.

Tenga en cuenta que es una construcción #elif en la sintaxis "preprocesador".

Tenga en cuenta también que C, C++ y ECMAScript - y estoy seguro de que muchos más C-lenguajes - también tienen la propiedad de que no existe una declaración formal "else if". Más bien, en cada una de ellas, la conducta cae fuera de la definición de "otro" como anterior a una sola declaración.

3

Es un if-else de varias capas.

La razón es que tiene que ver con las reglas de sintaxis de C#. Un else es seguido por una declaración, y cualquier cadena if califica como una declaración.

2

No hay ninguna instrucción "else if" en C#.

No creo que haya ninguna palabras clave de declaración de varias palabras en C#.

+11

rentabilidad de rendimiento. ruptura de rendimiento –

+0

Bueno, es decir 'foreach..in' es una palabra clave de varias palabras, aunque un poco fragmentada. –

+1

'yield return' sería una palabra clave de declaración de varias palabras. Al igual que 'foreach (... en ...)', dependiendo de qué tan libremente quieras interpretar la frase. – cHao

2

Usted es correcto. Es solo un else seguido de un if.

3

La construcción else if nunca se menciona en el C# specification, excepto en algunos ejemplos donde se usa sin explicación. Así que no creo que sea una construcción especial, solo está anidada si las declaraciones.

+1

Tampoco aparece en la tabla de palabras clave (sección 2.4.3), que es la definición formal de lo que constituye un token de palabra clave. Eso es suficiente para mí, pero para llevarlo más lejos: una palabra clave se describe como "una secuencia de caracteres similar a un identificador"; la especificación para identificadores no permite caracteres en espacios en blanco. Como "else if" contiene al menos un carácter de espacio en blanco, diría que no es "una secuencia de caracteres similar a la del identificador". –

+0

@Dr. Wily: de la misma manera 'yield return' no es una palabra clave de acuerdo con la especificación. Pero todavía tiene significado. – configurator

1

Para ampliar la respuesta de @ cazador de la razón, como se golpeó en él que sin los soportes que sólo se ejecutará la siguiente línea, si se tratara de un montón de anidados los soportes más podría necesitar:

if(condition0) 
    statement0; 
else 
{ 
    if(condition1) 
    statement1; 
    else 
    { 
    if(condition2) 
     statement2; 
    else 
    { 
     if(condition3) 
     statement3; 
     else 
     ... 
    } 
    } 
} 
+0

Abajo el voto para explicar los corchetes, que es lo que él pensaba que estaba pasando? –

+0

El problema es que else-if * es * una estructura anidada if-else y no necesitas los corchetes (no es que no se animen si están realmente escritos en una nueva línea + estilo con sangría). Los corchetes no son sobre * líneas *, están sobre * declaraciones *. La declaración, en este caso, es otro * si *. –

+0

De acuerdo por completo, yo estaba más indicando que su pensamiento original era incorrecto, y si era como pensaba que tendría que ser tal como lo escribí. –

1

El Selection Statement de la Especificación del lenguaje C# solo muestra las declaraciones if y switch.Si selecciona la instrucción if, dice:

La instrucción if selecciona una instrucción para la ejecución basada en el valor de una expresión booleana.

sentencia if:

si (boolean-expresión) embebido en la declaración

-instrucción incrustada si (boolean-expresión) otra cosa incrustado-declaración booleano expresión: expresión

Un else parte está asociada con el léxico más cercano anterior si eso está permitido por la sintaxis

1

Los dos ejemplos tú das son equivalentes en todos los idiomas. En C o C#, es exactamente equivalente a otro, entonces si. En algunos otros idiomas, elseif es azúcar sintáctica para else, entonces si. Por lo tanto, no importa qué idioma utilice, compilarán el mismo código (o se interpretarán con el mismo comportamiento). Ver http://en.wikipedia.org/wiki/Conditional_%28programming%29#Else_If

+1

En general, "else if" es tratado como dos declaraciones separadas por un compilador/intérprete. Los idiomas con un constructo "else if" generalmente usan una sola palabra, como elseif o elif. –

Cuestiones relacionadas