2009-06-18 5 views
1

これは簡単な質問です。同じクラスの2つのラムダ式の内容がまったく同じ場合、コンパイラは1つのバッカーメソッドを生成して使用しますか、または各インスタンスに対してメソッドを生成しますか?ラムダ式が重複して同じ生成コードに解決されますか?

ctl.MouseOver += (sender,e) => UpdateStatus(); 
ctl.MouseOut += (sender,e) => UpdateStatus(); 

これは、1つのまたは2つのバッカーメソッドを生成していますか?

P.S.私はあなたが別のメソッドHandleUpdate(オブジェクト、EventArgs)を作成し、それにイベントを添付できることを知っています。しかし、コンパイラで実際に何が起こっているのか、より興味があります。

答えて

2

複雑です。 IIRC(と私はちょっと離れているかもしれませんが、正確な詳細を読んでからしばらくしています)、2つの式が同じインスタンスに "解決"しますが、実際は非常に難しいです。わずかに異なるクロージャーを作成し、その式で吊り上げる必要があります。基本的には、コールサイトも重要です。

1

それは2つのコピーを生成する私の経験でした。私がヒットしなかったいくつかの最適化があるかもしれませんが、私のコードをチェックインするたびに、私は2つのコピーを得ました。

重複する処理がある場合は、前述のようにHandleUpdateメソッドを作成することをおすすめします。

1

ラムダ式が同じクラスにあると、コンパイラはどのメソッドが呼び出されたかを考慮して同じ式を考慮するには不十分です。

同じメソッドで同じ式を2回使用すると、同じインスタンスが取得される可能性がありますが、この動作に依存するコードは作成しません。

実際にコンパイラの現在の動作を知る必要がある場合は、reflectorのコピーを取得し、生成されたILを見てください。

関連する問題