>백엔드 개발 >C++ >루프의 C# lambda 표현식이 동일한 변수를 캡처하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

루프의 C# lambda 표현식이 동일한 변수를 캡처하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2025-02-03 07:46:13320검색

Why Do C# Lambda Expressions in Loops Capture the Same Variable, and How Can This Be Resolved?
루프에서 C# lambda 표현 캡처 이해 및 해당 솔루션

루프 내의 람다 표현식은 일반적인 함정을 나타냅니다. 동일한 변수를 캡처하여 예상치 못한 결과를 초래합니다. 이는 Lambda 표현식이 생성시 변수의

를 캡처하지 않고 변수 자체에 대한 참조

를 캡처하지 않기 때문입니다. 이 예를 고려하십시오 :

예상 출력 (0, 2, 4, 6, 8) 대신 코드는 5 8 ​​초를 출력합니다. 이것은 모든 람다 표현식이 최종 (루프가 완료된 후 10 값)의 값을 참조하기 때문입니다. 각 람다가 생성 될 때의 값이 아닙니다. 솔루션 : 사본 생성 이를 해결하려면 각 반복 내에서 루프 변수의 사본을 작성하십시오. 이제 각 람다 표현식은 뚜렷한 변수를 포착하여 올바른 출력을 초래합니다. C# 5 이상 : Foreach and Catvs

C# 5 이상 버전에서
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>();

int variable = 0;
while (variable < 5)
{
    actions.Add(() => variable * 2);
    ++variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}</code>
루프의 동작은이 문제를 해결하기 위해 변경되었습니다. 컴파일러는 "클로저 할당 임시 변수"(CATV)를 사용하여 각 반복에 대해 별도의 변수를 자동으로 생성하여 수동 사본이 필요하지 않습니다. 이 단순화는 코드를 더 깨끗하고 읽기 쉽게 만듭니다. 그러나 루프 예제에는 여전히 명시적인 사본이 필요합니다.

위 내용은 루프의 C# lambda 표현식이 동일한 변수를 캡처하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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