Вопрос по c++, c#, scope, switch-statement – область видимости нечетной переменной в операторе switch

16

Этот вопрос напомнил мне старый без ответа вопрос в моей голове о переключателе:

    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 '? в C ++ (если я не ошибаюсь) мы могли бы использовать несколько случаев вместе, но в C # это невозможно, и мы должны закрытьcase 1 с break, поэтому следующий код кажется правильным в C ++ и неправильным в C #:

case 1:
case 2:
   SomeMethodUsedByBothStates();

Когда мы не можем иметь такое поведение, так почему мы должны быть в состоянии объявить emp вcase 1 и увидеть это вcase 2? Если никогда не бывает двух случаев вместе, то почему объект должен быть виден в обоих?

Ваш Ответ

4   ответа
2

используйте фигурные скобки для ускорения.

int personType = 1;
switch (personType)
{
    case 1: 
   {
     ///
     break;
   }
    case 2: 
   {
     ///
     break;
    }
    case 3: 
   {
        ///
        break;
   }
    ...
}
34

ые, объявленные внутри регистра, находятся в той же области, что и оператор 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;
    }
    ...
}
+1. Я узнал что-то новое только сейчас :) спасибо Mahdi Tahsildari
5

который вы показали, прекрасно работает в C #, предполагая, что в случае 2break или же :return

case 1:
    // no code here...
case 2:
    SomeMethodUsedByBothStates();
    break;

Пустые случаи могут провалиться.

Что такоене позволено иметь код в ветке case, которая проваливается. Таким образом, следующее будет недействительным:

case 1:
    SomeMethodUsedOnlyByCase1();
    // no break here...
case 2:
    SomeMethodUsedByBothStates();
    break;

Вопрос о сфере применения другой. По сути, область действия - это сам оператор switch, а не case-ветвь.

Чтобы ваш пример компилировался, просто предоставьте собственные области case-ветвей, добавив фигурные скобки:

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 ...");
}
0

тся с того места, где онаопределен до конца блока, в котором он 'определены. Так что различныеemp переменные находятся в области видимости до конца блока, который начинается с{ послеswitch заявление и заканчивается в соответствующем}, Там'ничего особенногоcase этикетки; они неизменить область видимости переменных.

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