スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
目次
匿名メソッドとは
あるメソッドがデリゲートを介してしか呼び出されない場合、匿名メソッドを使用すると記述が簡素になります。
逆に言えば、あるメソッドが他のクラスからアクセスされる可能性がある場合は、匿名メソッドを使用しない方がいいです。
匿名メソッドはC#2.0から使える機能です。この匿名メソッドという機能は、C#3.0で追加されたラムダ式の下位互換と言っても過言ではありません。
そのため、匿名メソッドを必ず理解する必要のある機能かと言われるとかなり微妙です。
匿名メソッドは、ラムダ式の良さを理解するための当て馬的な扱いをされることが多いです。
匿名メソッドを使わない場合との比較
ソースコード(匿名メソッドを使わない場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Anonymous01 { class Program { delegate void Del(); static void Hello() { Console.WriteLine("こんにちは"); } static void Main(string[] args) { Del message; message = Hello; message(); } } } |
実行結果
こんにちは
ソースコード(匿名メソッドを使った場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Anonymous02 { class Program { delegate void Del(); static void Main(string[] args) { Del message; message = delegate () { Console.WriteLine("こんにちは"); }; message(); //ラムダ式を使用した場合 //message = () => Console.WriteLine("こんにちは"); //message(); } } } |
実行結果
こんにちは
匿名メソッドは以下のように記述します。
delegate (引数)
{
メソッド内のコード;
};
匿名メソッドを使わない場合は、Helloメソッドがあります。
一方で、匿名メソッドを使った場合は、Helloという名前のメソッドが登場しません。
このようにメソッドの名前がないことから匿名メソッドと呼ばれます。
message = delegate ()
{
Console.WriteLine(“こんにちは”);
};
ちなみに、上のコードをラムダ式を使って書き換えると、以下のようなコードになります。
message = () => Console.WriteLine(“こんにちは”);
引数がある場合の例
引数のある場合を考えます。
通常のメソッド、匿名メソッド、ラムダ式の3パターンを比較します。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Anonymous05 { class Program { delegate int Calc(int x); static int Double(int x) { return 2 * x; } static void Main(string[] args) { int num = 100; Calc cal; //通常のメソッドの場合 cal = Double; Console.WriteLine(cal(num)); //匿名メソッドの場合 cal = delegate (int x) { return 2 * x; }; Console.WriteLine(cal(num)); //ラムダ式の場合 cal = (x) => 2 * x; Console.WriteLine(cal(num)); } } } |
実行結果
200
200
200
外部変数を使用する
値を2倍にするメソッドが、変数numに対してのみ使う場合を考えます。
メソッドを使用した時に、変数numの値が変更できれば、十分です。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Anonymous06 { class Program { delegate int Calc(int i); delegate int Calc2(); static int Double(int x) { return 2 * x; } static void Main(string[] args) { int num = 100; Calc cal; Calc2 cal2; //通常のメソッドの場合 cal = Double; Console.WriteLine(cal(num)); //匿名メソッドの場合 cal2 = delegate () { return 2 * num; }; Console.WriteLine(cal2()); //ラムダ式の場合 cal2 = () => 2 * num; Console.WriteLine(cal2()); } } } |
実行結果
200
200
200
通常のメソッドでは、変数numに直接アクセスできません。
一方、匿名メソッドとラムダ式は変数numにアクセスすることができます。
このように、匿名メソッドまたはラムダ式を使用した場合、引数を減らせる場合があります。
まとめ
通常のメソッドと比較した時の、匿名メソッドのメリットとデメリットを整理する。
メリット
・メソッドの定義とメソッドを使用する箇所が近い。そのため、ソースコードを行ったり来たりする作業が減る
・扱う引数が減る場合がある
デメリット
・他のクラス及びメソッドからアクセスされる可能性がある場合、匿名メソッドの使用は不適切。
※匿名メソッドとラムダ式の比較は別の記事で行う予定
~プログラミングを勉強してみませんか?~
TechAcademy [テックアカデミー] は無料の体験講座が用意されているので、気軽に体験できます。
※私(サイト主)も無料体験講座を実際に受けてみました(→感想)