C #에서 람다 식 또는 익명 메서드를 사용하는 경우 수정 된 클로저 함정 에 대한 액세스에 주의해야합니다 . 예를 들면 다음과 같습니다.
foreach (var s in strings)
{
query = query.Where(i => i.Prop == s); // access to modified closure
...
}
수정 된 클로저로 인해 위의 코드는 Where
쿼리 의 모든 절이의 최종 값을 기반으로하도록합니다 s
.
here 설명 된 것처럼 위의 루프 s
에서 선언 된 변수 foreach
가 컴파일러에서 다음과 같이 변환 되기 때문에 발생 합니다.
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
이 대신에 :
while (enumerator.MoveNext())
{
string s;
s = enumerator.Current;
...
}
here 에서 지적했듯이 루프 외부에서 변수를 선언하면 성능 이점이 없으며 일반적인 상황에서 루프 범위 밖에서 변수를 사용하려는 경우이를 생각할 수있는 유일한 이유는 다음과 같습니다.
string s;
while (enumerator.MoveNext())
{
s = enumerator.Current;
...
}
var finalString = s;
그러나 foreach
루프에 정의 된 변수는 루프 외부에서 사용할 수 없습니다.
foreach(string s in strings)
{
}
var finalString = s; // won't work: you're outside the scope.
따라서 컴파일러는 변수를 선언하고 디버깅하기 어려운 오류가 발생하기 쉬운 방식으로 선언하지만 인식 가능한 이점은 없습니다.
foreach
내부 범위 변수로 컴파일 된 경우 불가능한 방식 으로 루프로 할 수있는 작업이 있습니까? 아니면 익명 메소드와 람다 식을 사용할 수 있거나 공통적이기 전에 만들어진 임의의 선택입니까? 그때 이후로 수정되지 않았습니까?
foreach
있지 않지만 OP에 의해 표시된 것과 유사한 코드를 생성하는 람다 식에 대해 ...
String s; foreach (s in strings) { ... }
?