Область нечетных переменных в операторе switch
Этот вопрос напомнил мне о старом неотвеченном вопросе в моей голове о переключении:
int personType = 1;
switch (personType)
{
case 1:
Employee emp = new Employee();
emp.ExperienceInfo();
break;
case 2:
Employee emp = new Employee();
//Error: A local variable named 'emp' is already defined in this scope
emp.ManagementInfo();
break;
case 3:
Student st = new Student();
st.EducationInfo();
break;
default:
MessageBox.Show("Not valid ...");
}
почему emp распознается в "случае 2"? в С++ (если я не ошибаюсь) мы могли бы использовать несколько случаев вместе, но в С# это невозможно, и мы должны закрыть case 1
с разрывом, поэтому следующий код кажется правильным на С++ и неправильным в С#:
case 1:
case 2:
SomeMethodUsedByBothStates();
Когда мы не можем иметь такое поведение, почему мы должны иметь возможность объявлять emp в case 1
и видеть его в case 2
? Если никогда не случаются два случая, так почему же объект должен быть замечен в обоих?
Ответы
Ответ 1
Случаи не создают область действия в С++ или С#. Все эти переменные, объявленные внутри случая, находятся в той же области действия, что и оператор switch. Вам нужно использовать фигурные скобки, если вы хотите, чтобы эти переменные были локальными в каком-то конкретном случае:
switch (personType)
{
case 1: {
Employee emp = new Employee();
emp.ExperienceInfo();
break;
}
case 2: {
Employee emp = new Employee();
// No longer an error; now 'emp' is local to this case.
emp.ManagementInfo();
break;
}
case 3: {
Student st = new Student();
st.EducationInfo();
break;
}
...
}
Ответ 2
Второй код, который вы показали, отлично подходит для С#, если в случае 2 имеет значение break
или return
:
case 1:
// no code here...
case 2:
SomeMethodUsedByBothStates();
break;
Пустые случаи разрешаются.
То, что недопустимо, - это иметь код в ветки case, который проваливается. Таким образом, следующее недопустимо:
case 1:
SomeMethodUsedOnlyByCase1();
// no break here...
case 2:
SomeMethodUsedByBothStates();
break;
Вопрос о сфере действия другой.
В основном, область действия - это оператор switch, а не ветвь case.
Чтобы сделать ваш пример компиляцией, просто выделите области case-branches, добавив фигурные скобки:
int personType = 1;
switch (personType)
{
case 1:
{
Employee emp = new Employee();
emp.ExperienceInfo();
break;
}
case 2:
{
Employee emp = new Employee();
emp.ManagementInfo();
break;
}
case 3:
{
Student st = new Student();
st.EducationInfo();
break;
}
default:
MessageBox.Show("Not valid ...");
}
Ответ 3
Когда вы объявляете переменные внутри случая, используйте фигурные скобки для spesification.
int personType = 1;
switch (personType)
{
case 1:
{
///
break;
}
case 2:
{
///
break;
}
case 3:
{
///
break;
}
...
}
Ответ 4
Область не является вообще нечетной. Область локальной переменной - от точки, где она определена до конца блока, в котором она определена. Таким образом, различные переменные emp
находятся в области действия до конца блока, который начинается с {
после оператора switch
и заканчивается на соответствующем }
. Нет ничего особенного в case
ярлыках; они не изменяют область переменных.