C# delegateの簡単な使い方

C# delegateの簡単な使い方

C#でメソッドを代入して利用することができるdelegateの簡単な使い方を記述してます。

環境

  • OS windows10 pro 64bit
  • Microsoft Visual Studio Community 2019 Version 16.7.1

基本的な使い方

delegateの基本構文

delegate 戻り値の型 デリゲート型名(引数);

以下は、実際に、delegateを使用してメソッドを実行するまでのサンプルとなります。

using System;

namespace testapp
{
    // delegate宣言
    delegate void DelegateTest(int val);
    class Program
    {
        static void Main(string[] args)
        {
            // Showメソッドを変数「dt」に代入する
            DelegateTest dt = Show;
            // 変数「dt」からShowを呼ぶ
            dt(7);
        }
        static void Show(int num)
        {
            Console.Write("引数に指定した値は {0} です。\n", num);
        }

    }
}

実行結果

変数「dt」に代入している箇所を以下のように記述することも可能です。

DelegateTest dt = Show;

別クラスのメソッドも使用可能です。

using System;

namespace testapp
{
    // delegate宣言
    delegate void DelegateTest(int val);
    class Program
    {
        static void Main(string[] args)
        {
            // Showメソッドを変数「dt」に代入する
            DelegateTest dt = new Test().Show;
            // 変数「dt」からShowを呼ぶ
            dt(7);
        }
    }

    class Test
    {

        public void Show(int num)
        {
            Console.Write("引数に指定した値は {0} です。\n", num);
        }

    }
}

また、delegateはメソッドを追加することも可能です。

using System;

namespace testapp
{
    // delegate宣言
    delegate void DelegateTest(int val);
    class Program
    {
        static void Main(string[] args)
        {
            // Showメソッドを変数「dt」に代入する
            DelegateTest dt = new Test().Show1;
            // Show2を追加
            Test test = new Test();
            dt += test.Show2; 
            // 変数「dt」からShow1とShow2を呼ぶ
            dt(7);
        }
    }

    class Test
    {

        public void Show1(int num)
        {
            Console.Write("Show1の引数に指定した値は {0} です。\n", num);
        }

        public void Show2(int num)
        {
            Console.Write("Show2の引数に指定した値は {0} です。\n", num);
        }

    }
}

実行結果

削除する場合は、「dt -= test.Show2;」とします。

using System;

namespace testapp
{
    // delegate宣言
    delegate void DelegateTest(int val);
    class Program
    {
        static void Main(string[] args)
        {
            // Showメソッドを変数「dt」に代入する
            DelegateTest dt = new Test().Show1;
            // Show2を追加
            Test test = new Test();
            dt += test.Show2; 
            // 変数「dt」からShow1とShow2を呼ぶ
            dt(7);
            // Show2を削除
            dt -= test.Show2;
            // 変数「dt」からShow2が削除されているので、Show1のみが実行される
            dt(7);
        }
    }

    class Test
    {

        public void Show1(int num)
        {
            Console.Write("Show1の引数に指定した値は {0} です。\n", num);
        }

        public void Show2(int num)
        {
            Console.Write("Show2の引数に指定した値は {0} です。\n", num);
        }

    }
}

実行結果

delegateを使用すると条件により、実行するメソッドを変えることができたりします。

using System;

namespace testapp
{
    // delegate宣言
    public delegate int DelegateTest(int a, int b);
    
    class Program
    {
        static void Main(string[] args)
        {
            DelegateTest dt;
            int a = 1;

            //条件により分岐
            if (a == 0) { 
                dt = TestA;
            }
            else { 
                dt = TestB;
            }

            Console.WriteLine(dt(1, 2));
        }
        static int TestA(int x, int y)
        {
            return x + y;
        }

        static int TestB(int x, int y)
        {
            return x * y;
        }


    }
}

実行結果

上記のコードは匿名関数を使用すると以下のように記述することも可能です。

using System;

namespace testapp
{
    // delegate宣言
    public delegate int DelegateTest(int a, int b);

    class Program
    {
        static void Main(string[] args)
        {
            DelegateTest dt;
            int a = 1;

            //条件により分岐
            if (a == 0)
            {
                dt = delegate (int x, int y) { return x + y; }; ;
            }
            else
            {
                dt = delegate (int x, int y) { return x * y; }; ;
            }

            Console.WriteLine(dt(1, 2));
        }

    }
}

ラムダ式の場合は、以下となります。

using System;

namespace testapp
{

    class Program
    {
        static void Main(string[] args)
        {            
            int a = 1;
            Func<int, int, int> func;

            //条件により分岐
            if (a == 0)
            {
                func = (x, y) => x + y;
            }
            else
            {
                func = (x, y) => x * y;
            }

            Console.WriteLine(func(1, 2));
        }

    }
}