Lambda 표현식은 루프에서 인라인 함수를 정의하는 간결한 방법을 제공합니다. 그러나 람다에서 직접 반복 변수를 사용하면 나중에 예기치 않은 동작이 발생할 수 있습니다.
반복 변수의 람다 트랩:
다음 코드를 고려해보세요.
<code class="language-c#">for (int i = 0; i < 10; i++) { Action action = () => Console.WriteLine(i); actions.Add(action); } foreach (var action in actions) { action(); }</code>
각 람다가 해당하는 i 값을 인쇄한다고 생각할 수도 있습니다. 그러나 클로저로 인해 모든 람다는 i에 대해 캡처된 동일한 참조를 공유합니다.
예기치 않은 인쇄 결과:
루프가 종료되면 i는 10이 되고 이제 모든 람다는 이 최종 값을 가리킵니다. 결과적으로 람다를 실행하면 0에서 9까지의 예상 시퀀스 대신 "10"이 10번 인쇄됩니다.
이 동작은 루프가 완료된 후에도 범위 내에서 선언된 변수에 대한 참조를 유지하는 람다 클로저로 인해 발생합니다.
예방 조치 및 대안:
이 문제를 해결하려면 루프에 지역 변수를 만들고 반복 변수의 값을 할당하세요.
<code class="language-c#">for (int i = 0; i < 10; i++) { int j = i; // 创建一个局部变量 Action action = () => Console.WriteLine(j); actions.Add(action); } foreach (var action in actions) { action(); }</code>
이렇게 하면 각 람다가 서로 다른 j 값을 캡처하여 예상되는 인쇄 순서가 생성됩니다.
람다 표현식에서 반복 변수를 직접 사용하면 예기치 않은 종료 관련 조건이 발생할 수 있다는 점에 유의하세요. 대신, 필요한 값을 정확히 포착하기 위해 지역 변수를 생성하는 것을 고려해보세요.
위 내용은 람다 표현식이 반복 변수의 최종 값을 캡처하는 이유는 무엇이며 이를 방지할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!