Область нечетных переменных в операторе switch - программирование
Подтвердить что ты не робот

Область нечетных переменных в операторе 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? Если никогда не случаются два случая, так почему же объект должен быть замечен в обоих?

4b9b3361

Ответ 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 ярлыках; они не изменяют область переменных.