「キャプチャされた変数」では、変数はどのようにキャプチャされますか?
その「キャプチャされた」という用語は実際には何を表していますか?
ボックスを使用せずに値型を参照することを意味しますか?
ありがとう
「キャプチャされた変数」では、変数はどのようにキャプチャされますか?
その「キャプチャされた」という用語は実際には何を表していますか?
ボックスを使用せずに値型を参照することを意味しますか?
ありがとう
キャプチャされた変数は、通常、クロージャ(基本的にはインライン関数)でキャプチャされた変数を指します。「キャプチャ」とは、インライン関数が外部関数の変数への参照を「キャプチャ」する必要があることを意味します。これを行うために、C#コンパイラは内部クラスを生成し、参照によって外部変数を内部クラス(インライン関数が後で参照する)に渡します。コードを分解すると、これを確認できます。
次のことを考慮してください
void Main()
{
string s = "hello";
Action a = delegate
{
Debug.WriteLine(s);
};
s = "hello2";
a();
}
上記の例では、文字列変数sはインラインアクションaによってキャプチャされます。
内部的には、C#コンパイラは内部クラスを作成します。このクラスは、変数sの値をキャプチャするための参照をアクションします。文字列sはアクションaを参照して渡されるため、アクションは実際には「hello」ではなく「hello2」を出力することに注意してください。これは、明確に理解されていない場合、意図しない副作用を引き起こす可能性があり、「変更されたクロージャーへのアクセス」と呼ばれます。