ホームページ > バックエンド開発 > C++ > C# クロージャでの変数キャプチャはどのように機能しますか?

C# クロージャでの変数キャプチャはどのように機能しますか?

Susan Sarandon
リリース: 2025-01-12 21:16:44
オリジナル
992 人が閲覧しました

How Does Variable Capture Work in C# Closures?

C# クロージャでの変数キャプチャの詳細な説明

はじめに

変数キャプチャは、C# クロージャの基本的な側面であり、クロージャがそれを囲んでいるスコープ内で定義された変数にアクセスできるようにします。この記事では、変数キャプチャについて詳しく説明し、その仕組み、値型と参照型のキャプチャ、ボックス化に関する具体的な質問に答えます。

ローカル変数のキャプチャ方法

変数キャプチャは、ラムダ式または匿名メソッドが、それを囲んでいるスコープ内のローカル変数にアクセスするときに発生します。ただし、捕獲の正確なメカニズムは明らかではありません。

これを理解するために、簡単な例を考えてみましょう:

<code class="language-csharp">Action action = () => { Console.WriteLine(counter); };
int counter = 5;</code>
ログイン後にコピー

この例では、ラムダ式は変数 counter を囲むスコープ内でキャプチャします。これを実現するために、コンパイラは実際に、キャプチャされた変数への参照を保存するクロージャ クラスと呼ばれる匿名クラスを作成します。ラムダ式が実行されると、クロージャ クラスを介してキャプチャされた変数にアクセスします:

<code class="language-csharp">class ClosureClass
{
    private int counter;

    public ClosureClass(int counter)
    {
        this.counter = counter;
    }

    public void Execute()
    {
        Console.WriteLine(counter);
    }
}</code>
ログイン後にコピー

この場合、クロージャ クラスは変数 counter への参照を保存し、それにアクセスするメソッドを提供します。

値の型と参照型

キャプチャされた変数の型によって、それがクロージャ クラスにどのように格納されるかが決まります。

  • 値の型: 値自体はクロージャ クラスに格納されます。ボックス化またはボックス化解除の操作は必要ありません。
  • 参照型: オブジェクトへの参照はクロージャ クラスに格納されます。オブジェクトが後で変更された場合、キャプチャされた参照にはそれらの変更が反映されます。

梱包

値の型を取得するときにボックス化は必要ありません。キャプチャされた値はクロージャ クラスに直接保存され、キャプチャされた値に影響を与えることなく元の変数を変更できます。

以上がC# クロージャでの変数キャプチャはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート