Объявление переменной в операторе 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; } 
  • Почему оператор switch, а не if-else?
  • Как выбрать диапазон значений в инструкции switch?
  • Оператор switch: по умолчанию должен быть последний случай?
  • Как скомпилировать коммутатор в Visual C ++ и насколько он оптимизирован и быстро?
  • Должны ли команды switch всегда содержать предложение по умолчанию?
  • Использовать строку в корпусе переключателя в java
  • Несколько случаев в инструкции switch
  • Оператор переключения Java несколько случаев
  • Использовать «переход» в коммутаторе?
  • Какова относительная разница в производительности if / else по сравнению с оператором switch в Java?
  • Scanf не сканирует символ% c, но пропускает утверждение, почему?
  • Interesting Posts

    Как использовать View.OnTouchListener вместо onClick

    Что такое самонастройка?

    Почему я заблокировал перетаскивание окон через границы экрана (несколько мониторов) в Windows 10?

    Как выбрать папки, которые нужно игнорировать во время поиска?

    Как работают алгоритмы преобразования изображений ASCII?

    Могу ли я увеличить лимит оперативной памяти Windows XP 32bit на 3,5 ГБ с помощью / PAE?

    Отображение стека соединений ssh ​​в терминале

    jquery scroll, изменить активный class навигации, поскольку страница прокручивается относительно разделов

    Emacs: как переназначить Cx 5 2 (кадр переключения) на C-`в профиле .emacs

    Что такое «Аргумент-зависимый поиск» (также известный как ADL или «Koenig Lookup»)?

    Как выполнить поисковый запрос с Firebase с помощью Android FirebaseUI

    Тернарный оператор (? :) в Баше

    Лучший способ загрузки изображения с url в Android

    OpenID: попытка получить адрес электронной почты от Google OP

    Размер файла для файла ftp-сервера vs фактический размер файла

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