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