> 백엔드 개발 > C++ > C#에서 람다 표현식이 참조 대신 값으로 변수를 캡처하도록 하려면 어떻게 해야 합니까?

C#에서 람다 표현식이 참조 대신 값으로 변수를 캡처하도록 하려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2025-01-19 00:14:11
원래의
194명이 탐색했습니다.

How Do I Ensure Lambda Expressions Capture Variables by Value Instead of by Reference in C#?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿