C# 람다 표현식에서 참조 캡처 방지
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>
이 코드를 실행하면 "10"이 10번 인쇄됩니다. 이는 각 람다가 루프가 완료될 때 값이 10인 단일 i
변수에 대한 참조를 캡처하기 때문에 발생합니다.
이 참조 캡처를 방지하고 각 람다가 루프 변수 값의 자체 복사본을 가져오도록 하려면 루프 내에 로컬 복사본을 만듭니다.
<code class="language-csharp">for (int i = 0; i < 10; i++) { int copy = i; // Create a local copy actions.Add(() => Console.WriteLine(copy)); }</code>
이제 각 람다는 고유한 copy
변수를 캡처하여 생성 당시의 값을 유지합니다. 출력에는 0부터 9까지의 숫자가 올바르게 표시됩니다.
다른 언어(예: C )와 달리 C#은 람다 식 구문 자체 내에서 참조 또는 값 캡처를 명시적으로 지정하는 직접적인 메커니즘을 제공하지 않는다는 점을 이해하는 것이 중요합니다. 로컬 복사본을 만드는 것은 가치 포착 의미를 달성하기 위한 표준 해결 방법입니다.
위 내용은 C#에서 람다 표현식이 참조를 캡처하지 못하도록 하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!