문제
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# 언어 사양 다음을 설명합니다.
스위치 블록에서 선언 된 로컬 변수 또는 상수의 범위는 스위치 블록입니다.
초기화는 사례에서 이루어 지지만 선언은 범위 상단에서 효과적으로 수행됩니다. (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
사용이 결합 할 때 가장 유용합니다 Enum
S와 사용하지 않습니다 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;
}