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