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

Почему в инструкции 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 # указано следующее:

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

Инициализация происходит в этом случае, но объявление эффективно выполняется в верхней части области. (Псевдо-код)

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

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

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

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

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

Вот почему использование 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; } 
  • Использование случая для ряда чисел в Bash
  • Использовать «переход» в коммутаторе?
  • Как сделать заявление оператора C # использовать IgnoreCase
  • Как скомпилировать коммутатор в Visual C ++ и насколько он оптимизирован и быстро?
  • Почему Switch / Case, а не If / Else If?
  • Как отчет о работе коммутатора Реализован или работает внутри страны?
  • Корпус переключателя типа c #
  • «Else if» быстрее, чем «switch () case»?
  • идея выбора переключателя / образца
  • Несколько случаев в инструкции switch
  • Является ли «переключатель» быстрее, чем «если»?
  • Interesting Posts

    Как отправлять уведомления о блатной базе аудитории через HTTP

    Как преобразовать hex в rgb с помощью Java?

    Как добавить флаг -l “(ell) компилятора в CMake

    Утилита для отображения статуса живой клавиатуры и мыши для обучения и скринкастов

    Код элемента Entity Framework (EF) Первый каскадный вывод для отношения «один к нулю» или «один»

    Удаленный конструктор по умолчанию. Объекты все еще могут быть созданы … иногда

    Возможно ли запустить одновременно несколько AsyncTask?

    Завершение сеанса StopWatch с помощью делегата или lambda?

    Установка Maven на Mac OS X

    Создание папки из первых 5 символов имени файла в пакетном файле

    Как включить панорамирование и масштабирование в QGraphicsView

    Простой инструмент для захвата изображений для Mac OS X, который использует FireWire

    Как исправить Array indexOf () в JavaScript для браузеров Internet Explorer

    Расширение существующей функции jQuery

    FCM с AWS SNS

    Давайте будем гением компьютера.