"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Lambda Expressions는 왜 반복 변수의 최종 값을 캡처하고이를 어떻게 피할 수 있습니까?

Lambda Expressions는 왜 반복 변수의 최종 값을 캡처하고이를 어떻게 피할 수 있습니까?

2025-02-06에 게시되었습니다
검색:131

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

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

Lambda Expressions는 루프에서 인라인 함수를 정의하는 간결한 방법을 제공합니다. 그러나 람다에서 직접 반복 변수를 사용하면 나중에 예상치 못한 행동으로 이어질 수 있습니다.

반복 변수를위한 람다 트랩 :

다음 코드를 고려하십시오 :

for (int i = 0; i  Console.WriteLine(i);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

사람들은 각 람다가 해당 값을 인쇄한다고 생각할 수 있습니다. 그러나 모든 람다는 폐쇄로 인한 I에 대한 동일한 캡처 참조를 공유합니다.

우연한 인쇄 결과 :

루프가 종료되면 나는 10이되고 모든 람다는 이제이 최종 값을 가리 킵니다. 결과적으로, 람다를 실행하면 예상 시퀀스 대신 0에서 9까지 "10"10 번을 인쇄합니다.

이 동작은 Lambda 폐쇄에서 비롯됩니다. 루프가 완료된 경우에도 그 범위 내에서 선언 된 변수에 대한 참조를 유지합니다.

회피 및 대체 방법 :

]

이 문제를 해결하려면 루프에서 로컬 변수를 만들고 반복 변수의 값에 할당하십시오 :

for (int i = 0; i  Console.WriteLine(j);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

이렇게하면 각 람다가 다른 값을 캡처하여 예상 인쇄 시퀀스가 ​​발생합니다.

람다 표현식에서 반복 변수를 직접 사용하면 폐쇄와 관련된 예상치 못한 상황으로 이어질 수 있습니다. 대신, 필요한 값을 정확하게 캡처하기 위해 로컬 변수를 작성하는 것을 고려하십시오.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3