導入
毎回delegateを宣言するのは面倒です。C#にはあらかじめ用意された汎用デリゲート——値を返すFuncと、返さないAction——があり、実務ではほぼこれらを使います。
図解
flowchart TB
F["Func<引数..., 戻り値><br/>値を返す処理"] --> F1["Func<int, int, int><br/>int2つ → int"]
A["Action<引数...><br/>値を返さない処理"] --> A1["Action<string><br/>string → void"]
サンプル
// Func<引数の型..., 戻り値の型>: 最後の型が戻り値
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 4)); // 7
Func<int, int> square = n => n * n;
Console.WriteLine(square(5)); // 25
// Action<引数の型...>: 戻り値なし(void)
Action<string> greet = name => Console.WriteLine($"こんにちは、{name}さん");
greet("Taro"); // こんにちは、Taroさん
Func<..., 戻り値>は値を返す処理。型パラメータの最後が戻り値の型Action<...>は値を返さない処理(void)- ラムダ式
(引数) => 式で処理をその場で書ける。自前delegate宣言は不要
演習
// TODO: 2つの int を受け取り大きい方を返す Func<int, int, int> を max という名前で定義し、
// max(8, 3) を出力してください
___
- 期待される出力:
8
ヒント1を見る
Func<int, int, int> max = (a, b) => a > b ? a : b;
ヒント2を見る
Console.WriteLine(max(8, 3));
まとめ
Func<..., 戻り値>は値を返す処理、Action<...>は返さない処理- ラムダ式で処理をその場に書ける
- 実務では自前delegateよりFunc/Actionが主流
次回: 条件を表すPredicateとラムダ式の活用です。