Frage

Warum es ist, dass in einer C # switch-Anweisung für eine Variable in mehreren Fällen verwendet, erklären Sie es nur im ersten Fall?

Zum Beispiel führt die folgenden den Fehler „Eine lokale Variable mit dem Namen‚Variable‘bereits in diesem Bereich definiert ist“.

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

jedoch gemäß der Logik sollte die Erstmeldung nicht getroffen werden, wenn der Typ Type.B ist. Sind alle Variablen innerhalb einer switch-Anweisung existieren in einem Umfang, und sind sie geschaffen / zugewiesen, bevor eine Logik verarbeitet wird?

War es hilfreich?

Lösung

Ich glaube, es hat mit dem Gesamtumfang der Variablen zu tun, es ist ein Blockebene Bereich, der auf der Switch-Ebene definiert ist.

Persönlich, wenn Sie einen Wert etwas in einem Schalter in Ihrem Beispiel setzen für sie wirklich von Nutzen sein, würden Sie wollen, dass es ohnehin außerhalb des Schalters zu erklären.

Andere Tipps

Wenn Sie eine Variable wollen auf einen bestimmten Fall scoped, einfach, den Fall in seinem eigenen Block einschließen:

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

Ja, das ist der Umfang der gesamte Schalterblock - leider IMO. Sie können immer Klammern in einem einzigen Fall hinzufügen, jedoch einen geringeren Umfang zu schaffen. Als ob sie erstellt / zugeordnet - der Stapelrahmen hat genug Platz für alle lokalen Variablen in einer Methode (abgesehen von der Komplexität der erfassten Variablen). Es ist nicht so, dass der Raum während des Verfahrens der Ausführung zugeordnet ist.

Weil ihr Umfang am Schalterblock ist. Die C # Language Specification besagt Folgendes:

  

Der Geltungsbereich einer lokalen Variable oder Konstante in einem Schaltblock deklariert ist der Schaltblock.

Die Variablen Umfang in den C # Compiler teilen. Allerdings gibt es Spielraum in der gleichen Art und Weise nicht in CIL . Wie für die tatsächliche Erzeugung / Initialisierung ... lässt das .NET-Speichermodell der Compiler bewegen liest / ein wenig, solange einfache Regeln befolgt werden, schreibt es sei denn, die Variable als volatile .

Die Initialisierung erfolgt im Fall, aber die Erklärung wirksam an der Spitze des Bereichs erfolgt. (Psuedo-Code)

switch (Type)
{
string variable;

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

"In My Daaaaays ..."

swicth ist eine wirklich primitive Verfahrensimplementierung, die seit dem Alter von C gewesen ist selbst (noch vor C++).

Die ganze switch ist ein Block , die als Rahmen-contained GOTO: dient (daher der : in jedem case). Wenn Sie einige Assembler Klassen nehmen, die vielleicht bekannt vorkommen.

Deshalb Verwendung switch ist sehr hilfreich, wenn sie mit Enums kombiniert und nicht in jedem einzelnen break wie

mit case
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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top