>백엔드 개발 >C++ >람다 표현식이 반복 변수의 최종 값을 캡처하는 이유는 무엇이며 이를 방지할 수 있는 방법은 무엇입니까?

람다 표현식이 반복 변수의 최종 값을 캡처하는 이유는 무엇이며 이를 방지할 수 있는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-14 06:09:43964검색

Why Do Lambda Expressions Capture the Final Value of Iteration Variables, and How Can This Be Avoided?

람다 표현식에서 반복 변수를 사용할 때의 위험

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.