アレがアレでアレ

(できれば)プログラミング関係のことを書きたい

C#のデリゲートとか匿名関数とか

C#のデリゲートとかよくわかっていなかったんですが、こちらのすばらしい記事を読んだらなんとなく理解できたので忘れないようにメモ(ほとんど記事のまんまです)

qiita.com

デリゲートって

デリゲートとはメソッドを参照するための型
どうやらC#はメソッドを渡したり、返したりしてるのではなく、メソッドを参照しているデリゲートを渡したり、返したりしているらしいです。

public delegate int Hoge(int value);

このように書くことで、intを受け取ってintを返すデリゲートを定義できます。

デリゲートにメソッドを代入することでデリゲートからメソッドを呼び出すことができます。

class Program
{

    public delegate int Hoge(int value);

    public static int Add(int value)
    {
        return value + 1;
    }

    static void Main(string[] args)
    {
        Hoge f = Add;
        f(1); // -> 2
    }
}

デリゲートを自分で定義してみましたが、実は元々定義されているデリゲートもたくさんあります。

Action, Func<T, TResult>, Func<T1, T2, TResult>など...

例えばFunc<T, TResult>T型の引数を受け取って、TResult型を返すデリゲートになります。

上の例で置き換えるとこんな感じ

Func<int, int> f = Add;

匿名関数

先程の例で、デリゲートにメソッドを代入してみましたが、デリゲートを作るためにわざわざメソッドを定義して代入...はめんどい!ってことで匿名関数があります。

Func<int, int> f = delegate (int value) {
    return value + 1;
};

こうすることで、インラインでデリゲートを生成することができます。

ラムダ式を使うともっと短く書くことができます。

Func<int, int> f = value => value + 1;

ラムダ式は左辺を見て型推論してくれるので、右辺に型を書く必要はありません。

まとめ

  • メソッドを渡したり、返すのではなく、メソッドを参照しているデリゲートを渡したり、返したりしている。
  • デリゲートは自分で定義しなくても色々な型のデリゲートが元々定義されている。
  • 匿名関数、ラムダ式を使うとインラインでデリゲートを生成できる。

おわり。