c# - пример - оператор switch си




Объявление переменной в операторе switch C# (5)

Да, сфера охвата - весь блок коммутатора - к сожалению, ИМО. Однако вы можете добавлять фигурные скобки в одном случае, чтобы создать меньшую область видимости. Что касается того, созданы ли они / выделены - в стеке стека достаточно места для всех локальных переменных в методе (исключая сложности захваченных переменных). Это не похоже на то, что пространство выделяется во время выполнения метода.

Почему в инструкции switch C # для переменной, используемой в нескольких случаях, вы объявляете ее только в первом случае?

Например, следующее порождает ошибку «Локальная переменная с именем« переменная »уже определена в этой области».

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

Однако, по логике, первоначальная декларация не должна быть Type.B если тип Type.B . Все переменные в операторе switch существуют в одной области, и создаются они / распределяются до обработки любой логики?


Если вы хотите, чтобы переменная была привязана к конкретному случаю, просто вставьте ее в свой блок:

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

Переменные позволяют обмениваться областью в компиляторе C #. Тем не менее, область не существует одинаково в CIL . Что касается фактического создания / инициализации ... модель памяти .NET позволяет движению компилятора читать / записывать бит до тех пор, пока соблюдаются простые правила, если переменная не будет отмечена как volatile .


Потому что их область действия находится в блоке коммутатора. В спецификации языка C # указано следующее:

Объем локальной переменной или константы, объявленной в блоке коммутатора, является блоком коммутатора.


«В Моих Даааах ...»

swicth - действительно примитивная процедурная реализация, которая существует уже с самого начала C (даже до C++ ).

Весь switch - это блок, который служит в качестве GOTO: с областью видимости (отсюда : в каждом case ). Если вы взяли некоторые классы ассемблера, это может показаться знакомым.

Вот почему использование switch наиболее полезно при объединении с Enum s и не использовании break в каждом отдельном 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;
}




switch-statement