あんま慣れてないのでいっつも忘れるのでメモ。

public void test()
{
    //delegate使って匿名メソッドを定義
    Func<int, int> x = delegate (int n) { return n * 10; };
    Console.WriteLine(x(1));

    //↑をラムダ式で
    x = (n) => { return n * 20; };
    Console.WriteLine(x(1));

    //↑をラムダ式でさらに簡素に
    x = (n => n * 30);
    Console.WriteLine(x(1));

    //中身の匿名関数をラムダ式でその場で定義して var に入れる
    var y = new Func<int, int>(n => { return n * 40; });
    Console.WriteLine(y(1));

    //引数が複数の場合のdelegate
    Func<int, int, int> xx = delegate (int n, int nn) { return n * nn; };
    Console.WriteLine(xx(1,10));

    //引数が複数の場合のラムダ式
    xx = (n, nn) => { return n * nn; };
    Console.WriteLine(xx(1, 10));

    //中身の匿名関数をラムダ式でその場で定義して var に入れる 引数複数版
    var yy = new Func<int, int, int>((n,nn) => { return n * nn; });
    Console.WriteLine(yy(1, 10));

    //引数無しの場合のdelegate
    Func<int> xxx = delegate () { return 20; };
    Console.WriteLine(xxx());

    //引数が複数の場合のラムダ式
    xxx = () => { return 20; };
    Console.WriteLine(xxx());

    //中身の匿名関数をラムダ式でその場で定義して var に入れる 引数複数版
    var yyy = new Func<int>(() => { return 20; });
    Console.WriteLine(yyy());


    //Actionの場合 引数1個
    Action<int> a = delegate (int n) { Console.WriteLine(n); };
    a(30);
    a = (n) => Console.WriteLine(n);
    a(30);
    a = n => Console.WriteLine(n);
    a(30);
    //var b = new Action<int>(n => Console.WriteLine(n));
    var b = new Action<int>( (n) => { Console.WriteLine(n); });
    b(30);


    //Actionの場合 引数2個
    Action<int,int> aa = delegate (int n,int nn) { Console.WriteLine(n*nn); };
    aa(4, 10);
    aa = (n, nn) => { Console.WriteLine(n * nn); };
    aa(4, 10);
    var bb = new Action<int, int>((n, nn) => { Console.WriteLine(n * nn); });
    bb(4, 10);

    //Actionの場合 引数無し
    Action aaa = delegate () { Console.WriteLine(0); };
    aaa();
    aaa = () => { Console.WriteLine(0); };
    aaa();
    aaa = () => Console.WriteLine(0);
    aaa();
    var bbb = new Action( () => { Console.WriteLine(0); } );
    bbb();
}