Переменная в выражении оператора C # [дубликат]

Согласно спецификации HTML5 , & lt; script & gt; элементы с атрибутами src должны иметь только код с комментариями, который предназначен чтобы предоставить документацию для скрипта. Похоже, что Google не соответствует этой спецификации.

97
задан Peter Mortensen 4 May 2014 в 20:40
поделиться

6 ответов

Я полагаю, что это связано с общей областью переменной, это область уровня блока, которая определена на уровне коммутатора.

Лично, если вы задаете значение чему-то внутри коммутатора в вашем примере, чтобы это действительно имело какую-либо пользу, вы все равно захотите объявить его вне коммутатора.

41
ответ дан Otiel 16 August 2018 в 04:05
поделиться
  • 1
    Следуйте фигурным скобкам. Переменная существует только внутри самой внутренней фигурной скобки, в которой сначала объявляется переменная. – Jarrett Meyer 21 October 2008 в 18:02

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

switch (Type)
{
string variable;

    case Type.A:
            variable = "x";
                break;
    case Type.B:
            variable = "y";
                break;
}
0
ответ дан James Curran 16 August 2018 в 04:05
поделиться
  • 1
    Я уверен, что этот код не работает – Unknown Coder 22 July 2011 в 15:47
  • 2
    @Jim, Да, я знаю, что код не работает - вот почему я назвал его «псевдокодом», но это то, что «эффективно». сделанный. – James Curran 14 April 2013 в 15:06
  • 3
    Не совсем. Учтите, что если вы удалите break s, вы получите что-то вроде: `` `string variable = & quot; x & quot ;; переменная = "y"; `` `Это процедурный GOTO: для всех целей и целей. Правильный код должен быть чем-то вроде `` `string myVar; switch (myValue) {case MyEnum.A: myVar = & quot; x & quot ;; ломать; case MyEnum.B: myVar = "Y" ;; ломать; } `` ` – percebus 20 June 2014 в 06:42
  • 4
    @percebus - Что вы подразумеваете под «правильным»? В вашем примере область myVar будет находиться вне блока переключателей. Наша точка зрения заключается в том, что в этих масштабах область действия - это всего лишь блок переключения. – James Curran 1 July 2014 в 20:25
  • 5
    Дело в том, что, вопреки распространенному мнению, предложение switch равно scope, в отличие от предложения if. Это одна из основных причин switch, которые часто рассматриваются как «плохой код». (больше похоже на un-comprehended) Таким образом, объявление содержимого внутри скобок все еще делает его доступным в глобальной области. msdn.microsoft.com/en-us/library/06tc147t.aspx – percebus 24 November 2014 в 19:04

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

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

10
ответ дан Jeff Bridgman 16 August 2018 в 04:05
поделиться

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

29
ответ дан Jon Skeet 16 August 2018 в 04:05
поделиться
  • 1
    При всем моем уважении, ваша Skeetness, пожалуйста, не рекомендуем добавлять область в блок блокировки переключателя. Если вам нужна новая область для этого блока, вероятность того, что вы делаете слишком много в блоке. Вместо этого я предлагаю вам рекомендовать, чтобы обработка была нажата на вызов функции. – Randolpho 27 August 2010 в 15:44
  • 2
    @Randolpho: Я думаю, что это слишком общее заявление. Это может быть просто три или четыре строки, но затрагивающие две или три локальные переменные - достаточно для того, чтобы это было болью для реорганизации в вызов метода. – Jon Skeet 27 August 2010 в 19:19
  • 3
    Согласен, я столкнулся с этой проблемой не один раз, и это было для логики обработки двух или трех строк ... Попытка, что в отдельном методе - просто боль. – Philippe 16 January 2011 в 17:35
  • 4
    Поскольку моя переменная может изменить тип, зависит от меньшего объема коммутатора, который отлично работает. голосов. – Maxim 1 April 2013 в 23:05
  • 5
    @EdwardKarak: Только если вы все еще объявляете его в более высокой области. Если вы используете фигурные скобки для обоих , это должно быть хорошо. – Jon Skeet 13 December 2013 в 09:32

«В My Daaaaays ...»

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;
}
-2
ответ дан percebus 16 August 2018 в 04:05
поделиться

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

180
ответ дан Peter Mortensen 16 August 2018 в 04:05
поделиться
  • 1
    Примечание: это не сработает, если скобка закрыта только первым блоком, но не вторым. В этом случае вторая «переменная» все еще выдаёт ошибку, хотя области действия различны. Похож на ошибку. – Hi-Angel 13 October 2014 в 08:18
  • 2
    @ Привет-Ангел: это не ошибка. Несколько локальных переменных с тем же именем не могут быть объявлены внутри блока или его вложенных блоков. Фактически, вложенный блок «содержит» локальные переменные, объявленные в охватывающем блоке, даже если объявление происходит лексически позже в файле. Это справедливо и для конструкций, отличных от оператора switch. См. 3.3 спецификации языка C # – Michael Burr 14 October 2014 в 06:20
  • 3
    Я думаю, что я понял: если переменная существует в блоке, то я не могу больше использовать одно и то же имя во вложенном блоке, даже если вложенный блок находится выше объявления переменной. Это иррационально и должно быть ошибкой, но ошибка, выгравированная в документах, становится особенностью ☺ – Hi-Angel 14 October 2014 в 06:44
Другие вопросы по тегам:

Похожие вопросы: