Domanda

Perché in un'istruzione switch C #, per una variabile utilizzata in più casi, la dichiari solo nel primo caso?

Ad esempio, quanto segue genera l'errore " Una variabile locale denominata 'variabile' è già definita in questo ambito " ;.

switch (Type)
{
    case Type.A:
            string variable = "x";
                break;
    case Type.B:
            string variable = "y";
                break;
}

Tuttavia, secondo la logica, la dichiarazione iniziale non deve essere selezionata se il tipo è Type.B . Tutte le variabili all'interno di un'istruzione switch esistono in un singolo ambito e vengono create / allocate prima dell'elaborazione di qualsiasi logica?

È stato utile?

Soluzione

Credo che abbia a che fare con l'ambito generale della variabile, è un ambito a livello di blocco definito a livello di switch.

Personalmente se stai impostando un valore su qualcosa all'interno di uno switch nel tuo esempio perché possa davvero essere di qualche beneficio, vorresti dichiararlo comunque fuori dallo switch.

Altri suggerimenti

Se si desidera una variabile con ambito per un caso particolare, racchiudere semplicemente il caso nel proprio blocco:

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;
}

Sì, l'ambito è l'intero blocco switch, purtroppo IMO. Puoi sempre aggiungere parentesi graffe all'interno di un singolo caso, tuttavia, per creare un ambito più piccolo. Per quanto riguarda se sono creati / allocati - il frame dello stack ha abbastanza spazio per tutte le variabili locali in un metodo (lasciando da parte la complessità delle variabili acquisite). Non è che lo spazio sia allocato durante l'esecuzione del metodo.

Perché il loro ambito è nel blocco switch. La Specifiche del linguaggio C # indica quanto segue:

  

L'ambito di una variabile locale o costante dichiarata in un blocco switch è il blocco switch.

Le variabili condividono l'ambito nel compilatore C #. Tuttavia, l'ambito non esiste allo stesso modo in CIL . Per quanto riguarda la creazione / inizializzazione effettiva ... il modello di memoria .NET consente allo spostamento del compilatore di leggere / scrivere un po 'fintanto che vengono seguite semplici regole a meno che la variabile non sia contrassegnata come volatile .

L'inizializzazione avviene nel caso, ma la dichiarazione è effettivamente fatta nella parte superiore dell'ambito. (Pseudo-codice)

switch (Type)
{
string variable;

    case Type.A:
            variable = "x";
                break;
    case Type.B:
            variable = "y";
                break;
}

" In My Daaaaays ... "

swicth è un'implementazione procedurale davvero primitiva che esiste dall'età di C stesso (anche prima di C ++ ).

L'intero switch è un blocco che funge da GOTO: (quindi codice : in ogni case ). Se prendessi alcune classi assembler, questo potrebbe sembrare familiare.

Ecco perché l'uso di switch è molto utile quando si combina con Enum se non si utilizza break in ogni singolo case come

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top