Top > C# > デリゲートとラムダ(lambda)

デリゲートとラムダ(lambda)

デリゲートとは

関数(メソッド)を入れるための型
以下のように「delegate ...」のように定義する。 が、この書き方はほとんどしない。



    public class Delegate1Test(ITestOutputHelper output)
    {

    delegate void dlg1();
    delegate void dlg2(int arg1);
    delegate string dlg3();
    delegate string dlg4(int arg1);

    [Fact]
    public void a()
    {

    dlg1 d1 = method1;
    dlg2 d2 = method2;
    dlg3 d3 = method3;
    dlg4 d4 = method4;
    d1();
    d2(1);
    output.WriteLine(d3());
    output.WriteLine(d4(2));

    }

    private void method1()
    {
    output.WriteLine("method1");
    }
    private void method2(int arg1)
    {
    output.WriteLine($"method2(arg1:{arg1})");
    }
    private string method3()
    {
    return "method3";
    }
    private string method4(int arg1)
    {
    return $"method4(arg1:{arg1})";
    }
    }

デリゲートは個別に宣言しなくても、 Action<T>Func<T, TResult> という汎用のデリゲートがあるので通常これを使う。


    public class Delegate1Test(ITestOutputHelper output)
    {

        [Fact]
        public void b()
        {

            Action d1 = method1;
            Action<int> d2 = method2;
            Func<string> d3 = method3;
            Func<int, string> d4 = method4;
            d1();
            d2(1);
            output.WriteLine(d3());
            output.WriteLine(d4(2));
        }

        private void method1()
        {
            output.WriteLine("method1");
        }
        private void method2(int arg1)
        {
            output.WriteLine($"method2(arg1:{arg1})");
        }
        private string method3()
        {
            return "method3";
        }
        private string method4(int arg1)
        {
            return $"method4(arg1:{arg1})";
        }
    }

無名(匿名)関数とlambda(ラムダ)とは

名前のない関数のこと。
上記のようにデリゲートに名前付きで定義された関数を設定することもあるが、
ほとんどの場合は無名関数を用いてデリゲートに設定する

無名関数は以下のように「delegate ...」のように定義する。 が、この書き方も現在ほどんど使われず...


        [Fact]
        public void a()
        {

            Action d1 = delegate ()
            {
                output.WriteLine("method1");
            };
            Action<int> d2 = delegate (int arg1)
            {
                output.WriteLine($"method2(arg1:{arg1})");
            };
            Func<string> d3 = delegate ()
            {
                return "method3";
            };
            Func<int, string> d4 = delegate (int arg1)
            {
                return $"method4(arg1:{arg1})";
            };

            d1();
            d2(1);
            output.WriteLine(d3());
            output.WriteLine(d4(2));

        }

...無名関数はラムダ(lambda)で定義するのが一般的。



        [Fact]
        public void b()
        {

            Action d1 = () =>
            {
                output.WriteLine("method1");
            };
            Action<int> d2 = (int arg1) =>
            {
                output.WriteLine($"method2(arg1:{arg1})");
            };
            Func<string> d3 = () =>
            {
                return "method3";
            };
            Func<int, string> d4 = (int arg1) =>
            {
                return $"method4(arg1:{arg1})";
            };

            d1();
            d2(1);
            output.WriteLine(d3());
            output.WriteLine(d4(2));
        }

ラムダ(lambda)以下のように省略して記載することもできる。


    [Fact]
    public void c()
    {
        Action d1 = () => output.WriteLine("method1");
        Action<int> d2 =  arg1 => output.WriteLine($"method2(arg1:{arg1})");
        Func<string> d3 = () => "method3";
        Func<int, string> d4 = arg1 => $"method4(arg1:{arg1})";
        d1();
        d2(1);
        output.WriteLine(d3());
        output.WriteLine(d4(2));
    }