本文へスキップ
BecomeCoder

C#オブジェクト指向コース · 第4章 ジェネリクスとデリゲート · レッスン30

Func と Action

ブラウザで完結

導入

毎回delegateを宣言するのは面倒です。C#にはあらかじめ用意された汎用デリゲート——値を返すFuncと、返さないAction——があり、実務ではほぼこれらを使います。

図解

flowchart TB
    F["Func&lt;引数..., 戻り値&gt;<br/>値を返す処理"] --> F1["Func&lt;int, int, int&gt;<br/>int2つ → int"]
    A["Action&lt;引数...&gt;<br/>値を返さない処理"] --> A1["Action&lt;string&gt;<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とラムダ式の活用です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。