デリゲートとラムダ(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));
}
- 引数の型は不要
- 引数が一つなら () は不要。
- 1行なら{}は不要
- 1行の場合 return は不要