2012-12-05 23 views
16

This question przypomniał mi stare pytanie bez odpowiedzi w myślach o przełączniku:dziwne zakres zmienny w instrukcji 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 ..."); 
    } 

dlaczego EMP uznanej w „przypadku 2”? w C++ (jeśli się nie mylę) możemy korzystać z wielu przypadków razem, ale w języku C#, który jest niemożliwe i trzeba zamknąć case 1 z przerwą więc następujący kod wydaje się w C++, a co złe w C#:

case 1: 
case 2: 
    SomeMethodUsedByBothStates(); 

Kiedy nie możemy mieć takiego zachowania, więc dlaczego mielibyśmy być w stanie zadeklarować emp w case 1 i zobaczyć go w case 2? Jeśli nigdy dwa przypadki nie zdarzają się razem, dlaczego obiekt powinien być widoczny w obu?

Odpowiedz

34

Przypadki nie tworzą zakres w C++ lub C#. Wszystkie te zmienne zadeklarowane w przypadku są w tym samym zakresie, co zmienna instrukcja. Trzeba użyć nawiasów, jeśli chcesz te zmienne jako lokalne w pewnym konkretnym przypadku:

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; 
    } 
    ... 
} 
+4

+1. Nauczyłem się teraz czegoś nowego :) dzięki –

5

Drugi kod pokazałeś jest perfekcyjnie w języku C#, zakładając przypadek 2 miał break lub return:

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

Puste przypadki opada przez.
Co to jest , a nie dozwolone jest posiadanie kodu w odgałęzieniu sprawy, przez który przechodzi. Więc, co następuje byłby nieważny:

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

Pytanie o zakres jest inny. Zasadniczo zasięg to sama instrukcja switch, a nie case-branch.

Aby dokonać przykład kompilacji, wystarczy dać przypadku odgałęzieniami zakresy własnych poprzez dodanie nawiasów klamrowych:

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

Kiedy deklarujesz zmienne wewnątrz przypadku użycie szelki do spesification.

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

Zakres nie jest wcale nieparzysty. Zakres zmiennej lokalnej jest od punktu, w którym jest zdefiniowany do końca bloku, w którym jest zdefiniowany. Zatem różne zmienne emp znajdują się w zakresie aż do końca bloku rozpoczynającego się od { po stwierdzeniu switch i kończącym się na odpowiadającym }. Nie ma nic specjalnego w etykietach case; nie zmieniają zakresu zmiennych.

Powiązane problemy