【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回
ディスカッション
コメント一覧
まだ、コメントがありません