DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ラムダ式でハンドルしたイベントについて

環境/言語:[環境(Win XP、Win7)、使用言語(C#)、.Netバージョン(3.5.1)]
分類:[.NET]

初めて質問させて頂きます。

@IT 様の「C#ラムダ式 基礎文法最速マスター」などでも紹介されています通り、.NET 3.0 以降、ラムダ式を使用してイベントをハンドリングする事が可能です。

この「ラムダ式を使用したイベントハンドリングの後処理」について質問させて頂きます。

従来、イベントのハンドルを行う場合(例えば Button.Click イベントなど)、

button1.Click += button1_Click;

とし、

void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("ボタンがクリックされました。");
}

と記述していたコードがラムダ式を使用する事により、

button1.Click += (sender, e) => MessageBox.Show("ボタンがクリックされました。");

と、非常にコンパクトにコードを記述する事ができる様になりました。


ここで質問なのですが、前述(従来)の方法にてハンドルしたイベントを開放する場合、

button1.Click -= button1_Click; ・・・(★)

と書く事が出来ましたが、ラムダ式にてハンドルしたハンドラは、(★)により得られる結果と同じ結果を得るには、どの様に記述すれば良いのでしょうか?


上記について、私の検索方法が悪いのか、解決につながる情報が得られませんでした。

私が考える解決策としては、「ラムダ式を使用しない」と言う事しか思いつきませんでした。

どなたか、ラムダ式を使用したイベント ハンドラの解放について、解決策がお分かりになる方がいらっしゃいましたら、お手数ですが、ご教授の程、宜しくお願い致します。
> .NET 3.0 以降、ラムダ式を使用してイベントをハンドリングする事が可能です。
.NET のバージョンとは関係なく、C# 3.0 以降ですね。ラムダ式のサポートは。
開発ターゲットが .NET 2.0 でも使用できます。

さて本題ですが、一旦デリゲートオブジェクトとして変数に取るといいでしょう。
EventHandler handler = (sender, e) => MessageBox.Show("click");
button1.Click += handler;
button1.Click -= handler;

こんなのとか。
EventHandler handler = null;
handler = (sender, e) => {
    button1.Click -= handler;
    MessageBox.Show("click");
};
button1.Click += handler;
Hongliang 様

早速のご返信、ありがとうございます。


> .NET のバージョンとは関係なく、C# 3.0 以降ですね。ラムダ式のサポートは。

そうでした。ご指摘、ありがとうございます。



> 一旦デリゲートオブジェクトとして変数に取る

なるほど!ご教授頂いたコードにより、解決できました。

目からうろこが落ちる思いです。

大変、勉強になりました。ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板