【C#】Func<>とAction<>の違いとは?―初心者のためのシンプル解説

C#では、関数を「変数のように扱う」ことができます。

その代表的な仕組みがデリゲート(delegate)であり、その中でも特によく使われるのが Func<> と Action<>です。

この記事では、Func<> と Action<> の違いを、初学者向けにわかりやすく解説します。


1. ざっくり結論:戻り値があるかどうか!

  • Func<>:戻り値 あり
  • Action<>:戻り値 なし(void)

例:

  • Func<int, int>:intを受け取ってintを返す関数
  • Action<string>:stringを受け取って何も返さない関数(void)

2. Func<> の基本:戻り値ありの関数

例:

Func<int, int> doubleIt = x => x * 2;
int result = doubleIt(5);  // result は 10
  • Func<int, int> は、「int を受け取り、int を返す」関数。
  • 最後の型パラメータが「戻り値の型」。

複数の引数も使えます:

Func<int, int, string> sumToString = (a, b) => (a + b).ToString();
Console.WriteLine(sumToString(3, 4));  // 出力: "7"

3. Action<> の基本:戻り値なしの関数

例:

Action<string> greet = name => Console.WriteLine($"こんにちは、{name}さん!");
greet("花子");  // 出力: こんにちは、花子さん!
  • Action<string> は「string を受け取り、何も返さない」関数。
  • すべての型パラメータは「引数の型」だけ。

複数の引数にも対応:

Action<int, int> printSum = (a, b) => Console.WriteLine(a + b);
printSum(3, 5);  // 出力: 8

4. 引数なしのパターンもある

  • Func<int>:引数なし、int を返す
  • Action:引数なし、戻り値なし(完全に何も受け取らず返さない)

例:

Func<int> getRandom = () => new Random().Next(100);
Action sayHi = () => Console.WriteLine("やあ!");

5. Func<> と Action<> の違いまとめ

項目Func<>Action<>
戻り値あり(最後の型)なし(void)
用途計算や検索などの結果を返す処理表示やログ出力など副作用が目的の処理
型パラメータの意味最後の型が戻り値型、それ以前は引数全て引数、戻り値はvoidと固定

6. 練習問題

Q. Func<int, bool> とはどんな関数型でしょう?

Func<int, bool> isEven = ???;
Console.WriteLine(isEven(4));  // true
Console.WriteLine(isEven(7));  // false
Func<int, bool> isEven = x => x % 2 == 0;

7. さらに深めたい人へ

  • Predicate<T> は Func<T, bool> の特化版(戻り値が必ずbool)
  • イベントでは Action<> を使う場面が多い
  • LINQでは Func<> が頻出(Where、Select など)

まとめ

  • Func<> は「戻り値がある」関数型
  • Action<> は「戻り値がない」関数型
  • 最後の型が戻り値、それ以外が引数(Func)
  • 全て引数で、戻り値なし(Action)

今後の学習では、LINQやイベント処理などでこれらの型が頻繁に登場します。意味を理解しておくと、コードが読みやすくなり、再利用性も高まります。ぜひ、自分のコードにも取り入れてみましょう。

訪問数 5 回, 今日の訪問数 1回

C#,デリゲート

Posted by hidepon