読者です 読者をやめる 読者になる 読者になる

hayateasdf's blog

C#,javascript,pythonなどいろいろ。広く浅く

デリゲート(delegate)

デリゲート

メソッドを参照するための型。(匿名メソッド?)

 

あとこれ以外に長いですね。とりあえず基礎から。

delegate void SomeDelegate(int a);

 

    class DelegateTest

    {

   static void A(int n)

   {

   Console.WriteLine("A({0})が呼ばれました。", n);

   }

 

        static void Main(string[] args)

        {

            SomeDelegate a = new SomeDelegate(A);

            a(256);

        }

    }

 

・SomeDelegate a = new SomeDelegate(A); の部分でデリゲート型のaを生成し、

その中に同じ型(今回はvoid ~(int ~)型)を代入することで、その関数を変数のように扱う?ことができる感じがします。

 

 

複数のメソッドを代入

■マルチキャストデリゲート

    delegate void ShowMessage();

    class DelegateTest

    {

        static void Main()

        {

            ShowMessage a = new ShowMessage(A);

            a += new ShowMessage(B);

            a += new ShowMessage(C);

 

            a();

        }

        static void A() { Console.Write("A が呼ばれました。\n"); }

        static void B() { Console.Write("B が呼ばれました。\n"); }

        static void C() { Console.Write("C が呼ばれました。\n"); }

    }

    

 

・a+ = でデリゲート型を加えることが可能。

・a();で加えた分の全ての関数を呼び出せる。

 

クラスメソッドとインスタンスメソッドを混ぜて、複数のメソッドを代入することもできます。

 

    delegate void ShowMessage();

 

    class Person

    {

        string name;

        public Person(string name) { this.name = name; }

        public void ShowName() { Console.WriteLine("名前: {0}", this.name); }

    }

 

    class DelegateTest

    {

        static void Main()

        {

            Person p1 = new Person("梵天丸");

            Person p2 = new Person("伊達正宗");

 

            ShowMessage show = new ShowMessage(p1.ShowName);

            show += new ShowMessage(p2.ShowName);

            show += new ShowMessage(A) + new ShowMessage(B);

            show += new ShowMessage(C);

            

            show();

        }

        static void A() { Console.Write("A が呼ばれました。\n"); }

        static void B() { Console.Write("B が呼ばれました。\n"); }

        static void C() { Console.Write("C が呼ばれました。\n"); }

    }

    

結果は梵天丸、伊達正宗、A,B,Cが全部表示されます。

 

もっとありますが、結構難しくなるみたいなんでいったん止めておきます。また暇なときにでも。

参考URL↓

http://ufcpp.net/study/csharp/sp_delegate.html