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

C#에서 람다 표현식이 참조를 캡처하지 못하도록 하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-19 00:01:09213검색

How Can I Prevent Lambda Expressions from Capturing References in C#?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.