문제

C# 스위치 명령문에서 여러 경우에 사용되는 변수의 경우 첫 번째 경우에만 선언하는 이유는 무엇입니까?

예를 들어, 다음은 " '변수'라는 로컬 변수가 이미이 범위에서 정의되어 있습니다"오류를 던집니다.

switch (Type)
{
    case Type.A:
            string variable = "x";
                break;
    case Type.B:
            string variable = "y";
                break;
}

그러나 논리에 따라 유형이있는 경우 초기 선언에 맞지 않아야합니다. Type.B. 스위치 문의 모든 변수가 단일 범위로 존재하며 논리가 처리되기 전에 생성/할당됩니까?

도움이 되었습니까?

해결책

변수의 전체 범위와 관련이 있다고 생각합니다. 스위치 레벨에서 정의되는 블록 레벨 범위입니다.

개인적으로 예제의 스위치 내부에 가치를 설정하는 경우 실제로 어떤 혜택을받을 수 있도록, 스위치 외부에서 선언하고 싶을 것입니다.

다른 팁

특정 케이스에 가변 범위를 범한 경우, 사례를 자체 블록으로 동봉하십시오.

switch (Type)
{
    case Type.A:
    {
        string variable = "x";
        /* Do other stuff with variable */
    }
    break;

    case Type.B:
    {
        string variable = "y";
        /* Do other stuff with variable */
    }
    break;
}

예, 범위는 전체 스위치 블록입니다. 불행히도 IMO. 그러나 단일 케이스 내에 항상 버팀대를 추가하여 더 작은 범위를 만들 수 있습니다. 그들이 생성/할당 여부에 관해서는 - 스택 프레임에는 메소드의 모든 로컬 변수에 대한 충분한 공간이 있습니다 (캡처 된 변수의 복잡성을 제외하고). 메소드 실행 중에 공간이 할당되는 것은 아닙니다.

스코프가 스위치 블록에 있기 때문입니다. 그만큼 C# 언어 사양 다음을 설명합니다.

스위치 블록에서 선언 된 로컬 변수 또는 상수의 범위는 스위치 블록입니다.

변수는 C# 컴파일러에서 범위를 공유합니다. 그러나 범위는 동일한 방식으로 존재하지 않습니다. . 실제 생성 / 초기화에 관해서는 ... .NET 메모리 모델은 변수가 다음과 같이 표시되지 않는 한 간단한 규칙을 따르는 한 컴파일러 이동이 읽거나 쓸 수 있도록합니다. 휘발성 물질.

초기화는 사례에서 이루어 지지만 선언은 범위 상단에서 효과적으로 수행됩니다. (psuedo-code)

switch (Type)
{
string variable;

    case Type.A:
            variable = "x";
                break;
    case Type.B:
            variable = "y";
                break;
}

"내 daaaaays에서 ..."

swicth 나이부터 주변에 있었던 정말 원시적 절차 적 구현입니다. C 그 자체 (이전에도 C++).

전체 switch a 차단하다 그것은 스코프에 대한 역할을합니다 GOTO: (따라서 :case). 어셈블러 수업을 들었다면 친숙해 보일 수 있습니다.

그것이 이유입니다 switch 사용이 결합 할 때 가장 유용합니다 EnumS와 사용하지 않습니다 break 모든 싱글에서 case 처럼

switch(mood)
{
    case Mood.BORED:
    case Mood.HAPPY:
        drink(oBeer) // will drink if bored OR happy
break;

    case Mood.SAD: // unnecessary but proofs a concept
    default:
        drink(oCoffee)
break;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top