>백엔드 개발 >C++ >람다 표현식이 C#에서 반복자 변수의 최종 값을 캡처하는 이유는 무엇입니까?

람다 표현식이 C#에서 반복자 변수의 최종 값을 캡처하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-29 11:02:02730검색

Why Do Lambda Expressions Capture the Final Value of Iterator Variables in C#?

C#에서 반복자와 함께 람다 식 사용

C#에서 람다 식은 익명 함수를 정의하는 간결하고 편리한 방법을 제공합니다. 그러나 반복자와 함께 람다 표현식을 사용할 때 흔히 발생하는 함정은 캡처된 변수가 반복기 변수의 현재 값이 아니라 최종 값이라는 점입니다.

다음 코드를 고려하세요.

<code class="c#">Type[] types = new Type[] { typeof(string), typeof(float), typeof(int) };
List<PrintHelloType> helloMethods = new List<PrintHelloType>();

foreach (var type in types)
{
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
    helloMethods.Add(sayHello);
}

foreach (var helloMethod in helloMethods)
{
    Console.WriteLine(helloMethod("Hi"));
}</code>

이 코드를 실행하면 다음 출력이 인쇄될 것으로 예상할 수 있습니다.

Hi String
Hi Single
Hi Int32

그러나 실제 출력은 다음과 같습니다.

Hi Int32
Hi Int32
Hi Int32

이는 람다 식이 캡처하기 때문입니다. 람다가 정의된 시점의 값이 아닌 루프 변수 유형입니다. 따라서 람다가 실행될 때 유형의 최종 값인 Int32를 사용합니다.

이 문제를 해결하고 원하는 출력을 얻으려면 로컬 변수를 사용하여 반복자의 현재 값을 캡처할 수 있습니다.

<code class="c#">foreach (var type in types)
{
    var newType = type;
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
    helloMethods.Add(sayHello);
}</code>

이 경우 람다 식은 type의 현재 값이 할당된 지역 변수 newType을 캡처합니다. 이렇게 하면 람다 식이 실행될 때 올바른 유형 값을 사용하게 됩니다.

위 내용은 람다 표현식이 C#에서 반복자 변수의 최종 값을 캡처하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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