現在、次のように宣言されているページがあります。
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の外部でイベントハンドラを記述するのに慣れています。私の質問はこれにラムダ方式を使用するときに注意すべきパフォーマンスの欠点や落とし穴はありますか?確かに簡潔なので、私はそれを好みますが、使用するためにパフォーマンスを犠牲にしたくありません。ありがとう。
コンパイラがラムダ式を同等のデリゲートに変換するため、パフォーマンスへの影響はありません。ラムダ式は、コンパイラが使用するのとまったく同じコードに翻訳する言語機能にすぎません。
コンパイラは、持っているコードを次のようなものに変換します。
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
});
}
}
パフォーマンスに関しては、名前付きメソッドと同じです。大きな問題は、次の場合です。
MyButton.Click -= (o, i) =>
{
//snip
}
おそらく、元のラムダを残して、別のラムダを削除しようとします。そのため、ハンドラーも削除できるようにしたい場合を除き、問題はありません。
EventHandler handler = (s, e) => MessageBox.Show("Woho");
button.Click += handler;
button.Click -= handler;
私が認識している、またはこれまでに遭遇したことのあるパフォーマンスへの影響はありません。ただ「構文の砂糖」を知っていて、デリゲート構文などを使用するのと同じものにコンパイルされます。