デリゲート

 デリゲートは変数にメソッドの参照を格納して扱うことができる仕組みです。この仕組みによって、他のメソッドにデータ以外にも、処理を引数として渡すことができます。また、デリゲート型の変数に複数のメソッドを登録することもできます。

 デリゲートを使うには次のようにデリゲートを定義します。

デリゲート型宣言の書式
delegate 戻り値の型 デリゲート名(引数リスト);

 デリゲートを扱うにはデリゲート型の変数を次のように用意します。

デリゲート型変数宣言の書式
デリゲート名 変数名;

 デリゲート型の変数にメソッドを登録するには次のように記述します。

デリゲート登録の書式
デリゲート変数名 = 関数名;
デリゲート変数名 += 関数名;
デリゲート変数名 -= 関数名;

 関数をあらかじめ定義しておき、その関数名のみを指定して変数に代入します。「=」は1つ関数を登録します。「+=」を指定すると変数に関数を追加登録できます。また、「-=」を指定すると変数から関数を削除できます。

○ プロジェクト

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

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

サンプルダウンロード

○ プログラム

 では、デリゲートを宣言しましょう。次のようにプログラムを入力してください。

Program.cs

  1. class Program
  2. {
  3.  //デリゲート型の宣言
  4.  public delegate void Calc(int num1, int num2);
  5.  static void Main(string[] args)
  6.  {
  7.  }
  8. }

○ 解説

 12行目でデリゲートを宣言しています。今回は、二つの整数値を受け取って計算するメソッドを扱いたいと思います。この時点では、関数の仕様は決まっていますが、具体的な処理はまだ決まっていません。

○ プログラム

 次にデリゲートに登録する予定の関数を用意しましょう。今回は計算するメソッドも用意します。

Program.cs

  1. class Program
  2. {
  3.  //デリゲート型の宣言
  4.  public delegate void Calc(int num1, int num2);
  5.  //加算メソッドの定義
  6.  public static void AddingData(int data1, int data2)
  7.  {
  8.   Console.WriteLine("足し算の結果は" + (data1 + data2) + "です。");
  9.  }
  10.  //減算メソッドの定義
  11.  public static void SubtractionData(int data1, int data2)
  12.  {
  13.   Console.WriteLine("引き算の結果は" + (data1 - data2) + "です。");
  14.  }
  15.  //計算機メソッドの定義
  16.  public static void Calculation(Calc calc, int num1, int num2)
  17.  {
  18.   Console.WriteLine("計算を開始します。。。");
  19.   calc(num1, num2);
  20.   Console.WriteLine();
  21.  }
  22.  static void Main(string[] args)
  23.  {
  24.  }
  25. }

○ 解説

 15~18行目は加算メソッドを定義しています。このメソッドは2つの整数値を受け取り、加算結果をコンソールに表示します。

 21~24行目は減算メソッドを定義しています。このメソッドは2つの整数値を受け取り、減算結果をコンソールに表示します。

 27~32行目は計算機メソッドを定義しています。このメソッドの引数に注目してください。第1引数はデリゲート、第2,3引数は整数値を受け取ります。デリゲートを渡しているので、このメソッドは呼び出し側より処理するデータ以外にも、処理する内容を渡すようになっています。Calcデリゲート型の変数calcが宣言されていますが、30行目にあるように、その変数名をメソッド名のように扱うことができます。これにより、calc変数に登録されているメソッドが実行されます。

○ プログラム

 次に、Mainメソッドを記述しましょう。

Program.cs

  1. static void Main(string[] args)
  2. {
  3.  //デリゲート型の変数を宣言
  4.  Calc calc;
  5.  //計算用の変数を宣言
  6.  int data1, data2;
  7.  while (true)
  8.  {
  9.   //メニューを表示
  10.   Console.Write("1)加算 2)減算 9)両方 その他)終了:");
  11.   string menunum = Console.ReadLine();
  12.   try
  13.   {
  14.    if (!(menunum == "1" || menunum == "2" || menunum == "9"))
  15.    {
  16.     return;
  17.    }
  18.    //2つの数字を入力
  19.    Console.Write("1つ目のデータ:");
  20.    data1 = Int32.Parse(Console.ReadLine());
  21.    Console.Write("2つ目のデータ:");
  22.    data2 = Int32.Parse(Console.ReadLine());
  23.    switch(menunum)
  24.    {
  25.     case "1":
  26.      //加算メソッドをデリゲートにセット
  27.      calc = AddingData;
  28.      break;
  29.     case "2":
  30.      //減算メソッドをデリゲートにセット
  31.      calc = SubtractionData;
  32.      break;
  33.     case "9":
  34.      //加算・減算メソッドをデリゲートにセット
  35.      calc = AddingData;
  36.      calc = calc + SubtractionData;
  37.      break;
  38.     default:
  39.      return;
  40.    }
  41.    //計算機メソッドを実行
  42.    Calculation(calc, data1, data2);
  43.   }
  44.   catch(Exception e)
  45.   {
  46.    Console.WriteLine(e.Message);
  47.   }
  48.  }
  49. }

○ 解説

 37行目ではデリゲート型の変数を宣言しています。この変数にメソッドを登録する予定です。

 61~78行目でメニューに応じて分岐をします。加算を選択した場合は65行目でデリゲート型のcalc変数に加算メソッド名を指定してAddingDataメソッドを登録しています。減算を選択した場合は69行目でデリゲート型のcalc変数に減算メソッド名を指定してSubtractionDataメソッドを登録しています。また、両方を選択した場合は、73行目で加算メソッドを登録し、74行目で減算メソッドを加算しています。このように指定することでcalc変数から2つのメソッドを登録した順に呼び出すことができます。

 ここまででcalc変数に代入した処理と、入力した2つの数値を計算機メソッドに渡して実行してもらいます。どの処理を選んだかによって何が実行されるかが変わってきます。

○ 実行結果

1)加算 2)減算 9)両方 その他)終了:1
1つ目のデータ:2
2つ目のデータ:3
計算を開始します。。。
足し算の結果は5です。

1)加算 2)減算 9)両方 その他)終了:2
1つ目のデータ:6
2つ目のデータ:4
計算を開始します。。。
引き算の結果は2です。

1)加算 2)減算 9)両方 その他)終了:9
1つ目のデータ:10
2つ目のデータ:5
計算を開始します。。。
足し算の結果は15です。
引き算の結果は5です。

1)加算 2)減算 9)両方 その他)終了:e
(終了)

前へ   次へ