デリゲートの考え方(1)

2021年4月23日

デリゲートとは、メソッドを表すための型です。型なので、変数にメソッドを渡すこともできます。
具体例を見ていきましょう。

public void Kick()
{
    Console.WriteLine("キック");
}

このメソッドのタイプは、どのようなものでしょうか?

  • 戻り値がありません。
  • 引数がありません。

このパターンですね。

次も同じパターンです。

public void Punch()
{
    Console.WriteLine("パンチ");
}

変数を使う場合、まず、宣言が必要でしたね。

型名 変数名;

デリゲートに当てはめると、

Action attack;

Actionが型名、attackが変数名です。(Action型っておかしな型名ですが、サンプルを見ての通り、戻り値がない場合のメソッドを指していることを表すものなのです)

変数が宣言できたので、代入してみます。

attack = Kick;

呼び出すのは、

attack();

となります。

また、+=演算子で、同時に複数のメソッドを追加することもできます(マルチキャストデリゲートと言います)

attack += Punch;

まとめると、

class Player
{
    public void Kick()
    {
        Console.WriteLine("キック");
    }
    public void Punch()
    {
        Console.WriteLine("パンチ");
    }
    public void Combo()
    {
        Action attack;
        attack = Kick;
        attack += Punch;
        attack();
    }
}

ラムダ記号を使って、次のように書くこともできます。(式本体
1行メソッドが省略できます。ずいぶん短くなりますね。

class Player
{
    public void Kick() => Console.WriteLine("キック");
    public void Punch() => Console.WriteLine("パンチ");

    public void Combo()
    {
        Action attack;
        attack = Kick;
        attack += Punch;
        attack();
    }
}

表示

キック
パンチ

追記)このサンプルは、下記コードで、インスタンスを作成する必要があります。

class Program
{
    static void Main(string[] args)
    {
        Player falcon = new Player();
        falcon.Combo();
    }
}

https://soft-rime.com/post-1338/

C#,入門

Posted by hidepon