2012-10-19 8 views

答えて

7

キャプチャ変数は、一般的に閉鎖(基本的にインライン関数)で撮影した変数を参照します。 「キャプチャする」とは、インライン関数が外部関数の変数への参照を「取得」しなければならないことを意味します。これを行うために、C#コンパイラは内部クラスを生成し、内部変数(後でインライン関数が参照する)に外部変数を参照渡しします。コードを逆アセンブルすると、これを見ることができます。

は、上記の例では、以下の

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

を考慮し、文字列変数sは、インラインアクションAによって捕捉されます。

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

+0

これも価値があります。 http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx – pencilCake

関連する問題