匿名メソッド

 前節で、デリゲートを指定するときに名前付きのメソッドを定義していました。C#2.0以降では匿名メソッドが導入されました。匿名メソッドは名前を持たないメソッドで、処理の部分のみを定義します。処理内容を一時的に用意する場合に利用します。

 デリゲートで匿名メソッドを次のように定義します。

匿名メソッドの定義
delegate(引数リスト)
{
 処理の定義
};

 匿名メソッドでは引数がない場合は「()」を省略することもできます。

○ プロジェクト

 プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 AnonymousTest

サンプルダウンロード

○ 作成の準備

 「DelegateTest」プロジェクトを修正して作成しましょう。DelegateTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。

○ プログラム

 定義した加算・減算メソッドを削除して、次のように修正してください。

Program.cs

  1. class Program
  2. {
  3.  //デリゲート型の宣言
  4.  public delegate void Calc(int num1, int num2);
  5.  //計算機メソッドの定義
  6.  public static void Calculation(Calc calc, int num1, int num2)
  7.  {
  8.   Console.WriteLine("計算を開始します。。。");
  9.   calc(num1, num2);
  10.   Console.WriteLine();
  11.  }
  12.  static void Main(string[] args)
  13.  {
  14.   //デリゲート型の変数を宣言
  15.   Calc calc;
  16.   //計算用の変数を宣言
  17.   int data1, data2;
  18.   while (true)
  19.   {
  20.    //メニューを表示
  21.    Console.Write("1)加算 2)減算 9)両方 その他)終了:");
  22.    string menunum = Console.ReadLine();
  23.    try
  24.    {
  25.     if (!(menunum == "1" || menunum == "2" || menunum == "9"))
  26.     {
  27.      return;
  28.     }
  29.     //2つの数字を入力
  30.     Console.Write("1つ目のデータ:");
  31.     data1 = Int32.Parse(Console.ReadLine());
  32.     Console.Write("2つ目のデータ:");
  33.     data2 = Int32.Parse(Console.ReadLine());
  34.     switch(menunum)
  35.     {
  36.      case "1":
  37.       //加算メソッドをデリゲートにセット
  38.       calc = delegate(int dt1, int dt2)
  39.       {
  40.        Console.WriteLine("足し算の結果は" + (dt1 + dt2) + "です。");
  41.       };
  42.       break;
  43.      case "2":
  44.       //減算メソッドをデリゲートにセット
  45.       calc = delegate(int dt1, int dt2)
  46.       {
  47.        Console.WriteLine("引き算の結果は" + (dt1 - dt2) + "です。");
  48.       };
  49.       break;
  50.      case "9":
  51.       //加算・減算メソッドをデリゲートにセット
  52.       calc = delegate(int dt1, int dt2)
  53.       {
  54.        Console.WriteLine("足し算の結果は" + (dt1 + dt2) + "です。");
  55.       };
  56.       calc += delegate(int dt1, int dt2)
  57.       {
  58.        Console.WriteLine("引き算の結果は" + (dt1 - dt2) + "です。");
  59.       };
  60.       break;
  61.      default:
  62.       return;
  63.     }
  64.     //計算機メソッドを実行
  65.     Calculation(calc, data1, data2);
  66.    }
  67.    catch(Exception e)
  68.    {
  69.     Console.WriteLine(e.Message);
  70.    }
  71.   }
  72.  }
  73. }

○ 解説

 53~56、60~63、67~74行目で匿名メソッドを指定しています。ブロック内に処理を直接書くことで、名前のないメソッドを指定し、デリゲートに登録しています。

前へ   次へ