C#のデリゲート

デリゲートはメソッドの型を定義するものです。
どのようなパラメータを持ち、どのような戻り値なのかというメソッドの構造を決めておく仕組みです。

デリゲートは型なので、この型の変数を作る事ができます。
変数にはデリゲートで定義したのと同じ構造のメソッド(メソッドの参照)を代入する事ができます。

デリゲートを使えば、条件によって呼び出すメソッドを変えるといったことが容易に行えるようになります。



デリゲートの定義

デリゲートはキーワード(予約語) delegate を使って宣言します。
delegate 戻り値の型 デリゲート名(パラメータ);
delegate が付いている以外はメソッド定義の1行目と同じです。
デリゲートは型を定義するものなので必要なのはこれだけです。



デリゲートの使い方

条件によって呼び出すメソッドを変える

以下の例では、条件によって呼び出すメソッドを変えるています。
public delegate void TestDelegate(int num1, int num2);

public class Program
{
    public static void TestMethod1(int num1, int num2)
    {
         int answer = num1 + num2;
         Console.Write("足し算の結果は{0}", answer);
    }

    public static void TestMethod2(int num1, int num2)
    {
         int answer = num1 - num2;
         Console.Write("引き算の結果は{0}", answer);
    }


    public static void Main()
    {
        int num1 = 100;
        int num2 = 500;
        
        TestDelegate method;             //デリゲート型の変数を作成 
        
        if (num1 < num2)
        {
            method = TestMethod1;        //メソッドTestMethod1の参照を代入
        }
        else
        {
            method = TestMethod2;        //メソッドTestMethod2の参照を代入
        }
        
        method(num1, num2);              //メソッドを呼び出し(TestMethod1が実行される)
    }
}


メソッドのパラメータに利用する

デリゲートはメソッドのパラメータとしても利用する事ができます。
public delegate int TestDelegate(int num);

public class Program
{
    public static int TestMethod(int num)
    {
         return num * 2;
    }

    public static void EditArray(int[] list, TestDelegate method)   // パラメータがデリゲートが使われている
    {
        for (int i = 0; i < list.Length; ++i)
        {
            list[i] = method(list[i]);                              // 配列の全要素に対して処理を行っている
        }
    }


    public static void Main()
    {
        int[] list;
        
        list = new int[10];
        for (int i = 0; i < list.Length; ++i)
        {
            list[i] = i;
        }
        
        EditArray(list, TestMethod);                               // パラメータにメソッドを渡している
    }
}


複数のメソッドを代入する

デリゲートには += 演算子を使う事で複数のメソッドを代入する事ができます。
複数のメソッドが代入された場合、その全てが実行されます。
また、 -= 演算子を使うと代入したメソッドの参照を削除する事もできます。
public delegate void TestDelegate(int num1, int num2);

public class Program
{
    public static void TestMethod1(int num1, int num2)
    {
         int answer = num1 + num2;
         Console.Write("足し算の結果は{0}", answer);
    }

    public static void TestMethod2(int num1, int num2)
    {
         int answer = num1 - num2;
         Console.Write("引き算の結果は{0}", answer);
    }


    public static void Main()
    {
        int num1 = 100;
        int num2 = 500;
        
        TestDelegate method;             //デリゲート型の変数を作成 
        
        method  = TestMethod1;           //メソッドTestMethod1の参照を代入
        method += TestMethod2;           //メソッドTestMethod2の参照を追加で代入
        
        method(num1, num2);              //メソッドを呼び出し(TestMethod1とTestMethod2の両方が実行される)


        method -= TestMethod1;           //メソッドTestMethod1の参照を削除
        method(num1, num2);              //メソッドを呼び出し(TestMethod2だけが実行される)
    }
}



コメント