だらだらやるよ。

こげつのIT技術メモ

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を使用しない場合は、余計な注意を払う必要があるのがとても気持ち悪いですね。


もちろんデリゲートを多用すると後で処理を追いづらくなるので、そのへんはバランスかなぁと思いますが:-)
なんか「こういうときは使え!」みたいな指標があるとわかりやすいんでしょうけどねー。。。はてはて。