Nice programing

Switch 케이스에서 추가 중괄호의 목적은 무엇입니까?

nicepro 2020. 12. 27. 20:48
반응형

Switch 케이스에서 추가 중괄호의 목적은 무엇입니까?


이 일에 대해 궁금합니다 ... 예를 참조하십시오.

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

내 평생 동안 케이스 b처럼 해왔지만 C #을 사용하면 사용할 수 있고 Visual Studio를 사용하면 해당 항목을 축소 할 수 있으므로 궁금합니다. 케이스 a (중괄호 포함)와 케이스 b의 실제 차이점은 무엇입니까? ?


중괄호 {}는 작업 집합의 범위를 정의하는 데 사용됩니다. 이상하게도 다음이 컴파일되고 작동합니다.

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

보시다시피이 한 가지 방법에서 각각 a라고하는 4 개의 변수를 만들었습니다. 지역 변수로서 자체 범위 내에서만 존재하기 때문에 각각은 완전히 별개입니다.

그게 말이 되나요?


중괄호 한 쌍의 (하지 브라켓 - []-하지 괄호 - ()-하지만 중괄호 {} ) 그들에 0 개 이상의 문으로는 C #에서 법적 문이며, 따라서 문이 법적으로 나타날 수 있음을 어디서든 나타날 수 있습니다.

다른 사람들이 지적했듯이 그렇게하는 일반적인 이유는 그러한 문이 새로운 지역 변수 선언 공간을 도입하고 안에 선언 된 지역 변수 범위 를 정의하기 때문입니다. (요소의 "범위"는 해당 요소가 정규화되지 않은 이름으로 참조 될 수있는 프로그램 텍스트의 영역입니다 .)

스위치의 범위 지정 규칙이 약간 이상하기 때문에 이것이 특히switch 성명 에서 흥미 롭다 는 점에 주목합니다 . 얼마나 이상한지에 대한 자세한 내용은 주제에 대한 내 기사의 "사례 3 :"를 참조하십시오.

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


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


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

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

in 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;
}

위의 두 오류는 서로 모순적으로 보입니다. 이 문제를 해결하려면 두 case 문에서 별도로 범위를 정의해야합니다.

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

Eric Lippert shared a very good link to his blog to explain variable scopes in case statement. You should have a look at it.

ReferenceURL : https://stackoverflow.com/questions/10095280/what-is-the-purpose-of-the-extra-braces-in-switch-case

반응형