【C#】Func<int, int>とは?―関数を変数のように扱える仕組みを徹底解説

C# では関数(メソッド)を「変数のように扱う」ことができます。

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

本記事では、Func<int, int> に焦点を当てて、基本から応用までやさしく解説します。


1. Func<int, int>とは?

Func<int, int>

これは「int型の引数を1つ受け取り、int型の値を返す関数を表す変数」という意味です。

✔️ 「intを受け取ってintを返す」関数の

✔️ 関数そのものを「変数のように扱える」

使用例

Func<int, int> square = x => x * x;
Console.WriteLine(square(5));  // 出力: 25

この square は「整数を受け取って、その2乗を返す関数」です。


2. 【補足】Func<int, int> の2つの int の意味

Func<int, int>

このような Func<…> の中に書かれる型パラメータには 明確なルール があります。

順番型パラメータ役割
第1引数int関数の引数の型(入力)
第2引数int関数の戻り値の型(出力)

パターンの読み方

Func<引数の型, 戻り値の型>

たとえば:

Func<int, int> f = x => x * x;

これは「intを1つ受け取ってintを返す」関数 f を定義しています。


3. 複数の引数を持つ場合は?

Func<> は最大16個までの引数を持てます。

その場合は「最後の型」が戻り値、それ以前のすべてが引数の型です。

書き方意味
Func<int, int, string>intを2つ受け取り、stringを返す関数
Func<string, bool>stringを受け取り、boolを返す関数

使用例

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

4. なぜFunc<>を使うの?

以下のようなメリットがあります:

メリット内容
関数の再利用処理を共通化して何度も使える
柔軟な設計が可能関数を引数として渡せるため、処理の切り替えが簡単
コードが簡潔になる無名関数(ラムダ式)をその場で記述できる

5. 実際の使い方(コード例)

(1) 通常の関数と同様に使える

Func<int, int> triple = n => n * 3;
Console.WriteLine(triple(10));  // 出力: 30

(2) 関数を引数として渡す

void ApplyAndPrint(Func<int, int> func, int value)
{
    Console.WriteLine(func(value));
}

ApplyAndPrint(x => x + 10, 5);  // 出力: 15

6. 匿名メソッドとラムダ式の違い

かつては 匿名メソッド を使っていました(C# 2.0):

Func<int, int> square = delegate(int x) { return x * x; };

C# 3.0 以降は ラムダ式 が導入され、より簡潔になりました:

Func<int, int> square = x => x * x;

7. よくある用途

LINQとの組み合わせ

var numbers = new[] { 1, 2, 3, 4 };

var doubled = numbers.Select(n => n * 2);          // Func<int, int>
var even = numbers.Where(n => n % 2 == 0);         // Func<int, bool>

LINQメソッド(Select, Whereなど)で Func<> は必須です。


8. 練習問題

// 次のFuncを定義して、結果を出力してみましょう。

Func<int, int> calc = ???;
Console.WriteLine(calc(7));  // 出力: 49 になるように
Func<int, int> calc = x => x * x;

まとめ

項目内容
Func<>戻り値のある関数を表す型(最大16引数)
Func<int, int>intを受け取り、intを返す関数
ラムダ式x => x * x のように簡潔に書ける
最後の型は戻り値型それ以外はすべて引数型

次のステップ

  • Func<int, bool> などで 条件判定 を表現する方法を学ぶ
  • Action<>(戻り値なし)との違いを理解する

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

C#,デリゲート

Posted by hidepon