2013-03-14 6 views
9

私は「ラムダ式」のトピック(第17章、代理人、代理人のためのC#構文的砂糖)に目を通しています。ジェフリーは、C#コンパイラがバックグラウンドに次のような新しい非静的クラスを作成すると述べています。ラムダ式:コンパイラの動作

  1. ラムダ式でアクセスされたすべてのローカル変数を格納するフィールド。
  2. ボディにラムダ式が含まれ、シグネチャ/リターンタイプがラムダ式が使用されたデリゲートに一致するメソッド。

私は、次の2つの質問があります:私は自分自身をデバッグ少しをしたとラムダ式は、ローカル変数の値を変更する場合(ラムダExpresisonがされている方法で定義されているのを見

  1. を)、新しい値はエクスプレッション本体の外部にも反映されます。表現が実際に別のクラスにあると考えると、これはどのように可能ですか?

  2. Staticクラスで完璧に行うことができる場合、送信されるクラスを非静的にする必要があるのはなぜですか?

これは私が理解できない非常に単純な概念ではないことを願っています。

詳細をお知らせください。

答えて

5

まず、私は数日前に同様の質問がありました。

Closure captured variable modifies the original as well

第二に、それは静的なクラス作りのポイントは何ですか?とにかく1つのオブジェクトだけが作成され、そのオブジェクトはアプリケーションの存続期間中に存続する必要はありません。

the new value is reflected outside the expression body too. How is this possible considering the expression is actually in a different class.

事は、それはあなたがそれを変更するところから問題ではありませんので、同じオブジェクトは、anonymus方法だけでなく、anonymus方法外部ローカル変数の両方によって参照されているということです、あなたが変更同じこと。

また、私がリンクしている質問でTim Goodmanによって提供された回答は、匿名メソッド内に新しいオブジェクトを作成することで、変更がどこにも反映されないようにするために何をすべきかを示します。

+0

偉大な答え。ありがとう。 – astraldust

+0

あなたは元気で元気です。 – Freeman