2012-04-10 1 views
56

나는 볼 ...이 일에 대해 궁금 예 :Switch의 경우 중괄호의 목적은 무엇입니까?

switch(x) 
{ 
    case(a): 
     { 
     //do stuff 
     } 
     break; 
    case(b): 
     //do stuff 
     break; 
} 

내 인생 내가 사례 B처럼 그것을 한 적이 있지만, C 번호는 내가 그것을 사용할 수 있습니다, 그리고 이후 비주얼 스튜디오 나 붕괴 할 수 있습니다 저것, 나는 호기심이 있습니다 - 케이스 a (중괄호 포함)와 케이스 b의 실제 차이점은 무엇입니까?

+15

경우 A의 정의 된 변수는 그 블록에서만 볼 수있는 것을 제외하고는 차이가 없습니다. –

+3

아무 것도 없습니다.케이스로 범위가 지정된 오브젝트를 만들고 사용하려는 경우가 있습니다. 괄호가 없으면 사용자가 볼 수있는 범위가 더 넓습니다. – Robinson

+1

당신이 물어 보지 못한 것이지만, 나는'case' 블록을 읽기가 어렵다고 느낍니다. 범위 지정 또는 다른 복잡성이 필요하면 새로운 방법을 얻습니다. –

답변

71

중괄호 {}는 일련의 작업 범위를 정의하는 데 사용됩니다. 기이 다음은 컴파일 작업 : 당신이 볼 수 있듯이

private void ConnectionStateChange(object sender, StateChangeEventArgs e) 
{ 
    string s = "hi"; 
    switch(s) 
    { 
     case "hi": 
      { 
       int a = 1; 
       a++; 
      } 
      { 
       int a = 2; 
       a++; 
      } 
      break; 
    } 

    { 
     int a = 1; 
     a++; 
    } 
    { 
     int a = 2; 
     a++; 
    } 
} 

, 나는 네 개의 변수를 만들었습니다 그 하나의 방법으로, 각각을했다. 로컬 변수는 자체 범위 내에서만 존재하기 때문에 각각은 완전히 별개입니다.

어떤 의미가 있습니까?

+0

+1 아주 재미있는 논증을 위해. – SouthShoreAK

+0

잘 설명해 주셔서 감사합니다. – Wish

+55

왜 기괴하게? 꽤 정상적인 것 같지만 (인위적 임에도 불구하고). – Joey

30

새 변수를 만들 수있는 새 범위를 만듭니다.

13

사용 된 변수에 대해 새 범위를 만듭니다. 변수의 범위는 때때로 까다로울 수 있습니다. 예를 들어, 게시 한 코드에서;

switch(x) 
{ 
    case(a): 
     { 
     int i = 0; 
     } 
     break; 
    case(b): 
     i = 1; // Error: The name 'i' doesn't exist in the current context 
     break; 
} 

오류가 case(b)a 변수가 범위를 벗어나 액세스 여기에서 이해된다. 이제 다른 한편으로는

switch(x) 
{ 
    case(a): 
     { 
     int i = 0; 
     } 
     break; 
    case(b): 
     int i = 1; // Error: A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else 
     break; 
} 

위의 두 가지 오류는 서로 상반됩니다. 이 문제를 얻으려면

switch(x) 
{ 
    case(a): 
     { 
     int i = 0; 
     } 
     break; 
    case(b): 
     { 
     int i = 1; // No error 
     } 
     break; 
} 

에릭 Lippert의이 경우 문에서 변수 범위를 설명하는 아주 좋은 link to his blog를 공유, 두 경우 문에서 개별적으로 범위를 정의해야합니다. 당신은 그것을 봐야합니다.

77

중괄호 (안 괄호-[] -하지 괄호-() -하지만 중괄호{})의 한 쌍의 그들에 0 개 이상의 문으로는 C#에서 법적 문이며, 따라서 진술이 합법적으로 나타날 수있는 곳이면 어디든 나타날 수 있습니다. 다른 사람들이 지적했듯이 이러한 문은 다음 범위를 그 안에 선언 된 지역 변수의을 정의하는 새로운 지역 변수 선언 공간을 소개하기 때문에

은 이렇게의 일반적인 이유입니다. (요소의 "범위"요소가의 규정되지 않은 이름에 의해 참조 될 수있는 프로그램 텍스트의 영역임을 기억하자.) 나는 이것이 switch 문 때문에에 특히 재미 있습니다

스위치의 범위 지정 규칙은 조금 이상합니다. 그들이 얼마나 이상한 대한 자세한 내용은 "사례 3 :"참조 주제에 내 문서 :

http://ericlippert.com/2009/08/13/four-switch-oddities/

+1

+1은 진정한 근원입니다. –

+0

저는 C 스위치가 프로그래밍에서 좀 더 기괴하고 문제가있는 구성 요소 중 하나이기 때문에 항상 C#이 더 똑똑한 스위치 설명을하지 않았다는 것에 실망했습니다. –

+6

@ NateC-K : C# *는 더 나은 switch 문을 소개했습니다! C# 디자이너들은 C/C++ switch 문의 단점을 면밀히 검토하고 여러면에서이를 개선했습니다. 예 : (1) "fall through through"규칙은 일반적인 버그 소스를 제거합니다. (2) 현을 켤 수 있습니다. (3) null 입력 가능 유형을 전환 할 수 있습니다. (4) 케이스 라벨의 종류는 스위치의 관리 유형과 호환이되는지 확인한다. (5) "goto case 1"은 C++와는 달리 제대로 작동합니다. 등등; 거의 모든 생각의 방법으로 C# 스위치가 개선되었습니다. –

관련 문제