for-loop 외부 및 for-loop 외부에서 동일한 이름의 변수를 정의 할 수없는 이유는 외부 범위의 변수가 내부 범위에서 유효하기 때문입니다. 이것이 허용된다면 for-loop 내에 두 개의 'i'변수가 있음을 의미합니다.
보다: MSDN 범위
구체적으로 특별히:
local-variable-declaration (8.5.1 절)에 선언 된 지역 변수의 범위는 선언이 발생하는 블록입니다.
과
for 문의 초기화에 대해 선언 된 지역 변수의 범위 (섹션 8.8.3)는 초기화 장치, for 조건, for-iterator 및 for 문의 포함 명령문입니다.
또한 지역 변수 선언 (C # 사양의 섹션 8.5.1)
구체적으로 특별히:
local-variable-declaration에 선언 된 로컬 변수의 범위는 선언이 발생하는 블록입니다. 로컬 변수의 로컬 변수 선언 앞에있는 텍스트 위치에서 로컬 변수를 참조하면 오류가 발생합니다. 지역 변수의 범위 내에서 다른 지역 변수 나 상수를 같은 이름으로 선언하는 것은 컴파일 타임 오류입니다.
(Emphasis mine.)
이는 i
for 루프 내부 의 범위가 for 루프 임을 의미합니다 . i
for-loop 외부의 범위 는 전체 주요 방법 과 for-loop입니다. 의미하는 것은 두 번 나타납니다i
는 위와 같이 유효하지 않은 루프 내부에 한다는 입니다.
허용되지 않는 이유 는 루프 내에서만 사용할 수 int A = i;
있기 때문 int i
입니다 for
. 따라서 더 이상 외부에서 액세스 할 수 없습니다for
루프 .
보시다시피이 두 가지 문제는 범위를 벗어난 결과입니다. 첫 번째 문제 ( int i = 4;
)는 루프 범위 i
내 에서 두 개의 변수를 생성합니다 for
. 이므로int A = i;
범위를 벗어난 변수에 액세스 할 수 있습니다.
대신 할 수있는 i
것은 전체 메소드에 범위가 지정되어 선언 하고 메소드와 for 루프 범위 모두에서 사용하는 것입니다. 이렇게하면 규칙을 어 기지 않아도됩니다.
public static void Main()
{
int i;
for (i = 0; i < 5; i++)
{
}
// 'i' is only declared in the method scope now,
// no longer in the child scope -> valid.
i = 4;
// 'i' is declared in the method's scope -> valid.
int A = i;
}
편집 :
물론 C # 컴파일러는이 코드가 상당히 유효하게 컴파일되도록 변경 될 수 있습니다. 결국 이것은 유효합니다 :
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
그러나 코드 가독성 및 유지 관리가 다음과 같은 코드를 작성할 수 있다면 실제로 도움이 될 것입니다.
public static void Main()
{
int i = 4;
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Console.WriteLine(i);
}
여기서 실수의 가능성에 대해 생각해보십시오. 마지막으로 i
0이나 4를 인쇄합니까? 이제 이것은 매우 작은 예입니다. 추적하기 쉽고 추적하기 쉽지만 외부 i
이름을 다른 이름으로 선언 한 것보다 유지 관리가 쉽고 읽기 쉽습니다 .
NB :
C #의 범위 지정 규칙은 C ++ 의 범위 지정 규칙과 다릅니다 . C ++에서 변수는 선언 된 위치부터 블록 끝까지 범위 내에 있습니다. C ++에서 코드를 유효한 구조로 만듭니다.