문제

이것에 영감을 받았습니다 의문 C#에서 다음 예가 모두 불법인지 궁금해하기 시작했습니다.

VoidFunction t = delegate { int i = 0; };

int i = 1;

그리고

{
   int i = 0;
}

int i = 1;

언어가 이런 식으로 설계된 정확한 이유를 알고 있는지 궁금합니다. 나쁜 프로그래밍 관행을 방해하는 것이며, 그렇다면 성능 이유 (컴파일 및 실행시) 또는 그 이유는 무엇입니까?

도움이 되었습니까?

해결책

이 동작은 C# 언어 사양의 섹션 3에서 다룹니다. 다음은 사양의 인용문입니다

유사하게, 람다-표현식의 형태로 익명 함수의 본문으로서 발생하는 임의의 표현은 익명 함수의 매개 변수를 포함하는 선언 공간을 만듭니다. 로컬 변수 선언 공간의 두 멤버가 동일한 이름을 갖는 것은 오류입니다. 블록의 로컬 변수 선언 공간과 동일한 이름의 요소를 포함하는 중첩 된 로컬 변수 선언 공간에 오류입니다. 따라서 중첩 된 선언 공간 내에서 로컬 변수를 선언하거나 국소 변수와 동일한 이름으로 상수를 선언 할 수 없거나 선언 공간에서 상수가 일정하지 않습니다.

이것을 읽는 더 쉬운 방법은 변수 선언 (및 기타 많은 블록 관련 기능)을 목적으로 Lambda/익명 대의원 블록이 일반 블록과 다르게 취급되지 않는다는 것입니다.

언어가 왜 이런 식으로 설계되었는지에 관해서는 사양이 명시 적으로 표시되지 않습니다. 내 의견은 단순성입니다. 코드가 다른 블록으로 취급되면 코드 분석 루틴이 더 쉬워집니다. 기존 루틴을 모두 보존하여 의미 적 오류 및 이름 해상도에 대한 블록을 분석 할 수 있습니다. 이것은 가변 리프팅을 고려할 때 특히 중요합니다. Lambdas는 결국 다른 기능이지만 선언 지점에서 여전히 모든 범위 변수에 액세스 할 수 있습니다.

다른 팁

내부 범위가 외부 범위에서 선언 된 변수에 액세스 할 수 있도록 이런 식으로 이루어 졌다고 생각합니다. 외부 범위에 존재하는 변수를 과도하게 쓰는 것이 허용 된 경우, 의도 된 행동에 대한 혼란이있을 수 있습니다. 따라서 문제가 발생하지 않도록 문제를 해결하기로 결정했을 수도 있습니다.

나는 Devs가 발에 촬영하는 것을 막는 것이 이런 식이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top