2017-11-21 1 views
1

일반적으로 C#에서 switch 문이C# switch 문은 switch 문 내의 각 case/default 블록에 중괄호를 사용합니까?

switch (sh) 
{ 
    case 1: 
     DoThis(); 
     DoThat(); 
     break; 
    case 2: 
     DoThis(); 
     DoThat(); 
     break; 
    default: 
     DoThis(); 
     DoThat(); 
     break; 
} 

처럼 보이는 그러나 사상 처음으로, 나는 다음과 같은 스위치 문 내에서 각각의 경우 문에 대해 괄호를 사용하는 사람을 보았다

switch (sh) 
{ 
    case 1: 
    { 
     DoThis(); 
     DoThat(); 
     break; 
    } 
    case 2: 
    { 
     DoThis(); 
     DoThat(); 
     break; 
    } 
    default: 
    { 
     DoThis(); 
     DoThat(); 
     break; 
    } 
} 

을 왜이 중괄호는 각각 위의 case 문과 default 문단에 대해 {, }이 사용되는 이유는 무엇입니까?

왜 필요합니까?

차이점은 무엇입니까?

+6

필요하지 않습니다.임의의 코드를 중괄호로 묶어 새 중첩 코드 영역을 만들 수 있습니다. – Will

+1

'switch() {case :}'문을 가지고있을 때 ... 여러 문장을 감싸기 가독성이 향상됩니다 .. – MethodMan

+0

코드 블록이 중첩 영역을 만들고 var의 범위를 제한한다는 것을 알고 있습니다. 위의 switch 문에서 이에 대한 이유가 표시되지 않습니다. 감사합니다 – pixel

답변

5

은 그들은 필요하지만 여러 지점에서 같은 이름의 변수를 선언 한 경우에는 유용되지 않습니다

switch (sh) { 
    case 1: 
     var test = "test"; 
     Console.WriteLine(test); 
     break; 
    case 2: 
     var test = "test"; 
     Console.WriteLine(test); 
     break; 
} 

이 컴파일되지 않습니다 충돌하는 변수 이름에 대해 불평. 그러나 중괄호를 추가하면 각 분기마다 고유 한 범위가 만들어지고 잘 컴파일됩니다.

switch (sh) { 
    case 1: { 
     var test = ""; 
     Console.WriteLine(test); 
     break; 
    } 
    case 2: { 
     var test = ""; 
     Console.WriteLine(test); 
     break; 
    } 
} 

변수를 정의하지 않아도 팔로워를 추가하는 사람도 있습니다.

+0

항상'case' 절이'switch' 단어와 함께 정렬되도록 코드를 들여 쓰면서 나를 귀찮게합니다. 나는 당신의 모범 에서처럼 그들을 좋아합니다. :) –

0

이전 코드의 유적입니다. 나는 C를 기억하지 못했을 때 나는 그저 다음 사건에 빠지게된다. ...

이것은 더 이상 적절하지 않으며 단지 코드 스타일이다.

참고도

switch (sh) 
{ 
    case 1: 
     DoThis(); 
     DoThat(); 
     break; 
    case 2: 
    { 
     DoThis(); 
     DoThat(); 
    }break; 
    case 3: 
    case 4: 
    { 
     DoThis(); 
     DoThat(); 
    } 
    case 5: 
     goto case 1; 
    default: 
    { 
     DoThis(); 
     DoThat(); 
    } 
} 

브레이크 그냥 스위치를 떠나 있지만 어떤 브래킷을 떠난 후 남아있을 것입니다 할 수 있습니다.

1

가끔 switch 문에 나타나는 문제는 모든 사례가 동일한 범위에 있다는 것입니다. 이는 두 가지 경우에서 동일한 변수 이름을 사용할 수 없다는 것을 의미합니다 (예를 들어). 이것을 고려하십시오 : 이것은 컴파일러 오류로 이어질 것입니다

switch (sh) { 
    case 1: 
     int result = 1; 
     return result; 
    case 2: 
     int result = 2; 
     return result; 
} 

, 동일한 범위에 두 번 result를 선언되기 때문에. 당신은 경우에 새로운 범위를 도입하여 오류를 제거합니다

switch (sh) { 
    case 1: { 
     int result = 1; 
     return result; 
    } 
    case 2: { 
     int result = 2; 
     return result; 
    } 
} 

들이 추가 복잡성을 소개하기 때문에 switch가지 경우 추가 범위를 추가하는 것은 혼란에 추가, 다소 논쟁 점을 고려. 나는 설명 된 문제로 이어지지 않는 방식으로 switch 블록을 사용하는 것을 선호한다. (코드의 양을 낮게 유지하고 큰 switch 블록을 피하려고한다.)

이 예에서는 범위가 필요하지 않으며 "일반적인"코드이므로 범위를 사용하지 않을 것입니다. 그리고 보통 이상한 것은 혼란을 의미합니다. 귀하의 질문은 그 의견에 대한 증거입니다. (그리고 종교적 전쟁을 피하기위한 의견 일뿐입니다.)이 구절은 당신에게 질문을하기에 충분한 혼란을 일으켰 기 때문에.