いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

C#で変数に関数を代入する、デリゲートについてわかりやすく解説。

 C#でデリゲートというのを使ってみましょう。Cで言うところの関数ポインタです。
 2つの処理があり、異なるのは中で使う関数だけということがあります。1つめの処理では、その中で関数 add(x, y) を使うとしましょう。例なので、この add(x, y) は単純な足し算を実行する関数です。もうひとつの処理では、ほとんど同じなのですが唯一、内部で使う関数が sub(x, y) (引き算を計算する関数)である点だけが異なっています。ほとんど同じ処理なのに2通りのルーチンを書くのもバカバカしいですよね。こんなとき、Cでは関数ポインタを使ったのでした。C#にはデリゲートというのがあります。
 例によって最小限のコードで解説します。

    int add(int x, int y) { return x + y; }
    int sub(int x, int y) { return x - y; }
    delegate int dlgt(int x, int y);//デリゲートを宣言しておく
    //----------------------------------
    dlgt func;
    func = add;//func に足し算を計算する関数を代入
    Debug.Log("add  " + func(5, 13));//5 + 13 が計算される
    func = sub;//func に引き算を計算する関数を代入
    Debug.Log("sub  " + func(5, 13));//5 - 13 が計算される

func が言わば関数を代入する変数になるのです。

 もうひとつの使い方を。

    int add(int x, int y) { return x + y; }
    int sub(int x, int y) { return x - y; }
    delegate int dlgt(int x, int y);//デリゲートを宣言しておく
    //----------------------------------
    int calc(dlgt func, int x, int y)
    {
        return func(x, y);
    }
    //----------------------------------
    Debug.Log("add  " + calc(add, 5, 13));//5 + 13 が計算される
    Debug.Log("sub  " + calc(sub, 5, 13));//5 - 13 が計算される

関数を、別の関数の引数に使えるのです。

 シューティングゲームで、例えばキャラクタの軌道をステージによって変えたいときに使えます。処理自体は変わりませんが、軌道のみ変えるわけです。軌道を決める関数を入れ換えれば別のステージのキャラクタの移動ルーチンのできあがりです!

 「C#にはこういう機能があるよ」といろいろ教えてくれる素晴らしいサイトがたくさんあってすごく勉強になるのですが、短いコードで教えてくれると助かります。初心者にはポイントが分かりません。様々の飾りなどは一切なくしてギリギリ、「これより1行でも少ないと役割を果たせない」コードがありがたいのです。そういうわけで今回もとにかく最小限のコードで。