C# Lambda 표현식의 값 캡처 및 참조 캡처
C#에서 Lambda 표현식은 바깥쪽 범위의 변수를 캡처할 수 있습니다. 기본적으로 이러한 캡처는 참조에 의한 것입니다. 즉, 람다 식이 원래 변수와 동일한 메모리 위치에 액세스한다는 의미입니다. 그러나 어떤 경우에는 참조가 아닌 변수의 복사본을 캡처해야 할 수도 있습니다.
질문:
다음 C# 코드를 고려하세요.
<code class="language-csharp">class Program { delegate void Action(); static void Main(string[] args) { List<Action> actions = new List<Action>(); for (int i = 0; i < 10; i++) actions.Add(() => Console.WriteLine(i)); foreach (Action a in actions) a(); } }</code>
문제 설명:
예상되는 출력은 목록을 반복하는 동안 각 Lambda 표현식이 해당 i 값을 인쇄하는 것입니다. 그러나 이 예에서 모든 람다 식은 값 10을 인쇄합니다. 이는 모두 동일한 변수 i를 참조함을 나타냅니다. 이는 람다 식이 참조로 i를 캡처하기 때문입니다.
해결책:
람다 표현식이 i 의 복사본을 캡처하도록 하려면 먼저 부분 복사본을 만드는 것이 한 가지 해결책입니다.
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // 创建局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>
설명:
루프에서 i의 로컬 복사본을 생성함으로써 Lambda 표현식은 해당 시점의 원본 i의 복사본인 copy 값을 캡처합니다. 이렇게 하면 각 람다 표현식에 고유한 값 복사본이 있고 해당 i 값이 인쇄됩니다.
차이:
참조로 변수를 캡처하는 것과 값으로 캡처하는 것의 차이점은 람다 표현식 외부의 변수와 상호 작용하는 방식입니다.
위 내용은 C#에서 람다 표현식이 참조 대신 값으로 변수를 캡처하도록 하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!