delegateについて
最近はデリゲートにもなれて、ちょこちょこと使っているのですが
後輩の子とかに便利さを説明しようと思っても、なかなかうまくいかないのでちょっとしたコードを書いておこうかな。と
簡単な計算機の例で、仕様はこんな感じ
- 数値を2つテキストボックスに入力し、加減乗除何れかのボタンを押す
- 計算前にメッセージボックスで「計算をはじめます」と表示する
- 計算結果をメッセージボックスで「計算結果:○○」と表示する
- メッセージボックスで「計算終了」と表示する
WindowフォームのForm1に数値を入力する、textbox1とtextbox2があり、加減乗除ボタンがbutton1からbutton4に割り振られてるとしたら
こんな感じでイベントとメソッドを記述っと
private delegate int Calc(int x,int y); private void Exec(Calc calc) { MessageBox.Show("計算をはじめます。"); int x = Convert.ToInt32(textBox1.Text); int y = Convert.ToInt32(textBox2.Text); int result = calc(x,y); MessageBox.Show("計算結果:" + result); MessageBox.Show("計算終了"); } private void button1_Click(object sender,EventArgs e) { Exec(new Calc(delegate(int x,int y) { return x + y; })); } private void button2_Click(object sender,EventArgs e) { Exec(new Calc(delegate(int x,int y) { return x - y; })); } private void button3_Click(object sender,EventArgs e) { Exec(new Calc(delegate(int x,int y) { return x * y; })); } private void button4_Click(object sender,EventArgs e) { Exec(new Calc(delegate(int x,int y) { return x / y; })); }
ポイントはExecメソッドの前半と後半でメッセージを表示するメソッドがあり、実際の計算処理は呼び出し側におまかせしているところ。
デリゲートを使わずに書くとこんな感じかな(足し算だけ)
private void button5_Click(object sender,EventArgs e) { ShowInitMessage(); ShowResultMessage(Convert.ToInt32(textBox1.Text) + Convert.ToInt32(textBox2.Text)); ShowFinMessage(); } private void ShowInitMessage() { MessageBox.Show("計算をはじめます。"); } private void ShowResultMessage(int result) { MessageBox.Show("計算結果:" + result); } private void ShowFinMessage(int result) { MessageBox.Show("計算終了"); }
ShowInitMessageとShowFinMessageを呼び出す順番が決まっているのに、使うときは自由に呼び出せてしまうので
Delegateを使用しない場合は、余計な注意を払う必要があるのがとても気持ち悪いですね。
もちろんデリゲートを多用すると後で処理を追いづらくなるので、そのへんはバランスかなぁと思いますが:-)
なんか「こういうときは使え!」みたいな指標があるとわかりやすいんでしょうけどねー。。。はてはて。