práctico - Declaración de variables en una declaración de cambio de C#
ejercicio práctico declaración de cambio (7)
¿Por qué en una declaración de cambio de C #, para una variable utilizada en múltiples casos, usted solo la declara en el primer caso?
Por ejemplo, lo siguiente arroja el error "Una variable local llamada ''variable'' ya está definida en este ámbito".
switch (Type)
{
case Type.A:
string variable = "x";
break;
case Type.B:
string variable = "y";
break;
}
Sin embargo, según la lógica, la declaración inicial no debería ser golpeada si el tipo es Type.B
¿Existen todas las variables dentro de una instrucción switch en un único ámbito, y se crean / asignan antes de procesar cualquier lógica?
Creo que tiene que ver con el alcance general de la variable, es un alcance de nivel de bloque que se define en el nivel de cambio.
Personalmente, si está estableciendo un valor para algo dentro de un interruptor en su ejemplo para que realmente sea beneficioso, querrá declararlo fuera del conmutador de todos modos.
La inicialización tiene lugar en el caso, pero la declaración se realiza efectivamente en la parte superior del alcance. (Código de Psuedo)
switch (Type)
{
string variable;
case Type.A:
variable = "x";
break;
case Type.B:
variable = "y";
break;
}
Las variables comparten alcance en el compilador de C #. Sin embargo, el alcance no existe de la misma manera en CIL . En cuanto a la creación / inicialización real ... el modelo de memoria .NET permite al compilador mover lecturas / escrituras un poco mientras se sigan reglas simples a menos que la variable esté marcada como volatile .
Porque su alcance está en el bloque de interruptor. La especificación del lenguaje C # establece lo siguiente:
El alcance de una variable local o constante declarada en un bloque de conmutadores es el bloque de conmutadores.
Sí, el alcance es todo el bloque de interruptores, lamentablemente, IMO. Sin embargo, siempre puede agregar llaves en una sola caja para crear un alcance más pequeño. En cuanto a si se crearon / asignaron, el marco de pila tiene suficiente espacio para todas las variables locales en un método (dejando de lado las complejidades de las variables capturadas). No es como que el espacio se asigna durante la ejecución del método.
Si desea una variable con alcance a un caso particular, simplemente encierre la caja en su propio bloque:
switch (Type)
{
case Type.A:
{
string variable = "x";
/* Do other stuff with variable */
}
break;
case Type.B:
{
string variable = "y";
/* Do other stuff with variable */
}
break;
}
"En My Daaaaays ..."
swicth
es una implementación de procedimiento realmente primitiva que ha existido desde las edades de C
(incluso antes de C++
).
El switch
completo es un bloque que sirve como un GOTO:
contenido-contenido GOTO:
(de ahí el :
en cada case
). Si tomó algunas clases de ensamblador, eso podría parecerle familiar.
Es por eso que el uso del switch
es más útil cuando se combina con Enum
y no se utiliza el break
en cada case
individual como
switch(mood)
{
case Mood.BORED:
case Mood.HAPPY:
drink(oBeer) // will drink if bored OR happy
break;
case Mood.SAD: // unnecessary but proofs a concept
default:
drink(oCoffee)
break;
}