web-dev-qa-db-ja.com

イベントハンドラーにラムダ式を使用する

現在、次のように宣言されているページがあります。

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //snip
        MyButton.Click += (o, i) =>
        {
            //snip
        }
    }
}

1.1から.NET 3.5に最近移行したばかりなので、Page_Loadの外部でイベントハンドラを記述するのに慣れています。私の質問はこれにラムダ方式を使用するときに注意すべきパフォーマンスの欠点や落とし穴はありますか?確かに簡潔なので、私はそれを好みますが、使用するためにパフォーマンスを犠牲にしたくありません。ありがとう。

98

コンパイラがラムダ式を同等のデリゲートに変換するため、パフォーマンスへの影響はありません。ラムダ式は、コンパイラが使用するのとまったく同じコードに翻訳する言語機能にすぎません。

コンパイラは、持っているコードを次のようなものに変換します。

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //snip
        MyButton.Click += new EventHandler(delegate (Object o, EventArgs a) 
        {
            //snip
        });
    }
}
97
Andrew Hare

パフォーマンスに関しては、名前付きメソッドと同じです。大きな問題は、次の場合です。

MyButton.Click -= (o, i) => 
{ 
    //snip 
} 

おそらく、元のラムダを残して、別のラムダを削除しようとします。そのため、ハンドラーも削除できるようにしたい場合を除き、問題はありません。

57
Gabe
EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
button.Click -= handler;
39

私が認識している、またはこれまでに遭遇したことのあるパフォーマンスへの影響はありません。ただ「構文の砂糖」を知っていて、デリゲート構文などを使用するのと同じものにコンパイルされます。

2
heisenberg