C#에서 Lambda 표현식은 바깥쪽 범위의 변수를 캡처할 수 있습니다. Lambda가 변수에 대한 참조를 캡처하면 해당 변수에 대한 모든 변경 사항이 Lambda에 반영됩니다. 이로 인해 다음 코드 조각에 표시된 것처럼 예기치 않은 동작이 발생할 수 있습니다.
<code class="language-C#">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번 출력됩니다. 이는 Lambda 함수가 변수 i
에 대한 참조를 캡처하고 for 루프에서 i
가 증가할 때 Lambda 함수가 계속 업데이트된 값을 확인하기 때문입니다.
참조 대신 변수의 복사본을 캡처하려면 다음 구문을 사용할 수 있습니다.
<code class="language-C#">[=] () => { ... } // 捕获副本</code>
이 예에서 Lambda 함수는 변수 i
의 복사본을 캡처하며 포함 범위의 i
에 대한 모든 변경 사항은 Lambda 함수에 반영되지 않습니다.
다음은 사본 캡처 방법을 보여주는 수정된 예입니다.
<code class="language-C#">for (int i = 0; i < 10; i++) { int copy = i; // 创建一个局部副本 actions.Add(() => Console.WriteLine(copy)); }</code>
이 경우 Lambda 함수는 Lambda 함수가 생성되었을 때 copy
값의 복사본인 i
값을 인쇄합니다.
참조 캡처와 복사본 캡처의 차이점을 이해하면 Lambda 함수에서 예기치 않은 동작을 방지할 수 있습니다.
위 내용은 C# Lambda 캡처의 참조 및 복사: 언제 예기치 않은 동작이 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!