C# で、デリゲート (delegate) 使うメリットを考えてみます。今回は、前回のデリゲートサンプルを匿名メソッドを使って書き換えてみます。
■ サンプルの概要
0 ~ 10 までの数字から特定の条件に合致する数字を出力します。具体的には次の仕様です。
- button 1 をクリックすると、2 で割り切れる数字だけをコピーします。
- button 2 をクリックすると、7 以上の数字だけをコピーします。
■ 前回のサンプル (C#)
delegate bool LT(int i); private void button1_Click(object sender, EventArgs e) { ListCopy(new LT(Num2)); } private void button2_Click(object sender, EventArgs e) { ListCopy(new LT(Num7)); } private void ListCopy(LT NumMethod) { bool bRet = true; for (int i = 0; i < 11; i++) { bRet = NumMethod(i); if (bRet) Console.WriteLine(i); } } private bool Num2(int i) { return ((i % 2) == 0) ? true : false; } private bool Num7(int i) { return (i >= 7) ? true : false; }
■ 匿名メソッドを使ったサンプル (C#)
匿名メソッドを使うと、別途メソッドを定義することが不要になるので、コード自体はすっきりとした印象になります。最初のサンプルではフラグ処理した場合でも結局は実行するメソッドが決まっているのだから、メソッド自体を引数にすればよいという考え方でした。メソッドが決まっているということはその内容も決まっていることなので、それであれば、内容も呼び出し元に書いておけばよいというのが今回の匿名メソッドの考え方です。
しかし、もともと Num2 や Num7 メソッドを作ったのは、処理が複雑になるかもしれないことを見越してのことです。今のところは各メソッドの内容が短いので、呼び出し元に匿名メソッドとして実装してもよいかもしれません。しかし、長くなると、匿名メソッドにするメリットが無いように思います。呼び出し元メソッドの中に他にも処理があると、全体の見通しが悪くなります。そのために、あるまとまった機能単位でメソッドとして独立させるのですから。また、他の場所から実行ができません。
逆にメソッドを公開していると、他の場所からも使われる可能性があります。いくら自分専用と思って作っておいても、他の場所から使割れると仕様変更が簡単にできないケースが出てきます。そんな時に匿名メソッドとして、呼び出し元に書いておけば、他の場所から呼ばれることはありません。仕様変更の際も自分の処理だけを考慮すればよいのです。
匿名メソッドは、メリットとデメリットがあると思います。
delegate bool LT(int i); private void button1_Click(object sender, EventArgs e) { ListCopy(delegate(int i) { return ((i % 2) == 0) ? true : false; }); } private void button2_Click(object sender, EventArgs e) { ListCopy(delegate(int i) { return (i >= 7) ? true : false; }); } private void ListCopy(LT NumMethod) { bool bRet = true; for (int i = 0; i < 11; i++) { bRet = NumMethod(i); if (bRet) listBox1.Items.Add(i); } }
結果
動作確認環境
Visual Studio 2015 Professional (C# 6.0)