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})";
}
}
C#

デリゲートは個別に宣言しなくても、 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})";
    }
}
C#

無名(匿名)関数と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));

}
C#

...無名関数はラムダ(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));
}
C#

ラムダ(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));
}
C#