[C#] デリゲート(delegate)とはなんぞや

小難しい講釈を省いて、ざっくり言うと、デリゲートとは関数を入れられる変数です。

では、Visual Studio でコンソールアプリケーションを作成し、hellowとだけ出力するプログラムを作ってみます。(* .NetFramewokr4.0を想定しています。)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace delegateConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            string word;
            word = "hellow";

            Console.WriteLine(word);

            Console.ReadLine(); //stopper
        }
    }
}

コンソールアプリケーションなので、staticなMain関数から始まります。

変数に文字を入れてコンソールに出力するだけです。
hellowとでるだけです。

さて、デリゲートとは関数を入れられる変数です。
なので、関数を使う形に変更します。

        static void Main(string[] args)
        {
            string word;
            word = "hellow";

            SayWord(word);

            Console.ReadLine(); //stopper
        }

        private static void SayWord(string word)
        {
            Console.WriteLine(word);
        }

もちろん、結果は何も変わらず、hellowです。

では、いよいよデリゲートを使います。

        private delegate void DelegateFunc(string _w);

        static void Main(string[] args)
        {
            string word;
            word = "hellow";

            DelegateFunc myFunc = SayWord;
            myFunc(word);

            Console.ReadLine(); //stopper
        }

        private static void SayWord(string word)
        {
            Console.WriteLine(word);
        }
  1.  関数SayWordと同じくstringの引数をとり、void型を返すDelegateFunc型を作ってあげる。(*型名はもちろんなんでも良い。)
  2. そのDelegateFunc型の変数myFuncを宣言して、SayWordを代入する。
  3. myFuncをSayWordのように使う。

以上。これだけ。
型を作るというのがピンと来ないかもしれないが、クラスや構造体を作る時と同じだと考えれば普通だ。

ちなみに、複数の関数を代入することもできる。

        private delegate void DelegateFunc(string _w);

        static void Main(string[] args)
        {
            string word;
            word = "hellow";

            DelegateFunc myFunc;
            myFunc = SayWord;
            myFunc += SayWordWord;
            
            myFunc(word);

            Console.ReadLine(); //stopper
        }

        private static void SayWord(string word)
        {
            Console.WriteLine(word);
        }
     
        private static void SayWordWord(string word)
        {
            word = word + word;
            Console.WriteLine(word);
        }

関数を追加したい場合、+=で追加できる。
実行結果は、

hello
hellohello

 

さて、「デリゲートとは何か」ざっくりだが、分かったんじゃなかろうか。

しかし、いつ、使うのか。

聞いたことがあるはずです。
イベントハンドラ。
コールバック。

いや、むしろ、イベントハンドラやコールバックを調べるうちに
「てか、デリゲートってなんぞ。」ってことでこのページを見てるかも?

イベントハンドラは、「ボタンが押された」「時間が来た」などのメッセージをイベントとして、受け取って処理を行う仕組みです。
コールバックは、「呼び戻す」。つまり別の流れから、呼び戻す関数のことをコールバック関数とか言いますね。

この辺りの言葉の定義はともかく、どっちもやってることは、デリゲートに関数を覚えさせて使っているだけです。
delegateをオリジナルで作って、使うってことはあまり無いですが、この関数を代入するという感覚は、知っておいたほうが良さげです。

 

気が向いたら今度はイベントハンドラあたりをちょっとだけ書くかも。

追記:イベントハンドラとはなんぞや

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>