5

「キャプチャされた変数」では、変数はどのようにキャプチャされますか?

その「キャプチャされた」という用語は実際には何を表していますか?

ボックスを使用せずに値型を参照することを意味しますか?

ありがとう

4

1 に答える 1

7

キャプチャされた変数は、通常、クロージャ(基本的にはインライン関数)でキャプチャされた変数を指します。「キャプチャ」とは、インライン関数が外部関数の変数への参照を「キャプチャ」する必要があることを意味します。これを行うために、C#コンパイラは内部クラスを生成し、参照によって外部変数を内部クラス(インライン関数が後で参照する)に渡します。コードを分解すると、これを確認できます。

次のことを考慮してください

void Main()
{
     string s = "hello";
     Action a = delegate 
     { 
          Debug.WriteLine(s);
     };
     s = "hello2";
     a();
} 

上記の例では、文字列変数sはインラインアクションaによってキャプチャされます。

内部的には、C#コンパイラは内部クラスを作成します。このクラスは、変数sの値をキャプチャするための参照をアクションします。文字列sはアクションaを参照して渡されるため、アクションは実際には「hello」ではなく「hello2」を出力することに注意してください。これは、明確に理解されていない場合、意図しない副作用を引き起こす可能性があり、「変更されたクロージャーへのアクセス」と呼ばれます。

于 2012-10-19T05:59:24.883 に答える