C#のActionとFuncを使いこなそう!初心者でもわかるメソッド活用テクニック
生徒
「C#でメソッドをもっと便利に使える方法ってありますか?」
先生
「はい、それにはActionやFuncというデリゲートを使う方法があります。」
生徒
「アクションとかファンクって何ですか?難しそう……」
先生
「大丈夫ですよ。日常の例えを使ってわかりやすく説明していきますね!」
1. デリゲートって何?
デリゲートとは、簡単に言うと「メソッド(関数)を代わりに呼び出す仕組み」です。リモコンのように「このボタンを押すとこの処理が動く」といった感覚で使えます。
プログラムで、どのメソッドを呼び出すかをあとから決めたり、条件によって変えたいときにとても便利です。
2. ActionとFuncとは?
ActionとFuncは、C#にあらかじめ用意されている汎用的なデリゲートです。
- Action: 戻り値のないメソッドを扱います(void型のメソッド)
- Func: 戻り値のあるメソッドを扱います(例えばintやstringなど)
たとえば「洗濯ボタン(Action)」は何も返しませんが、「温度を測るボタン(Func)」は結果を返してくれます。そんなイメージです。
3. Actionの使い方
次のコードでは、Actionを使って、あいさつを出力するメソッドを呼び出します。
using System;
class Program
{
static void Main()
{
Action greet = SayHello;
greet(); // SayHelloメソッドが呼び出される
}
static void SayHello()
{
Console.WriteLine("こんにちは!C#の世界へようこそ。");
}
}
このようにActionを使うことで、メソッドを変数のように扱うことができます。
4. Funcの使い方
Funcは戻り値のあるメソッドを扱います。次のコードでは、2つの数を足して結果を返すメソッドをFuncで呼び出しています。
using System;
class Program
{
static void Main()
{
Func<int, int, int> add = AddNumbers;
int result = add(5, 3);
Console.WriteLine("合計は: " + result);
}
static int AddNumbers(int a, int b)
{
return a + b;
}
}
Func<int, int, int>は、「intを2つ受け取り、intを返すメソッド」という意味です。
5. 無名メソッドと組み合わせよう
ActionやFuncは、メソッド名だけでなくその場で処理内容を書く「ラムダ式」とも相性がいいです。
using System;
class Program
{
static void Main()
{
Action greet = () => Console.WriteLine("こんにちは!");
greet();
Func<int, int, int> multiply = (x, y) => x * y;
Console.WriteLine("掛け算の結果は: " + multiply(4, 5));
}
}
このようにラムダ式を使えば、その場で小さな処理を定義して使うことができます。
6. 具体的な活用例:共通処理を引数で切り替える
ActionやFuncを使うことで、次のように「どんな処理を行うか」を引数として渡すことができます。
using System;
class Program
{
static void Main()
{
Execute(() => Console.WriteLine("保存処理を実行しました。"));
Execute(() => Console.WriteLine("印刷処理を実行しました。"));
}
static void Execute(Action action)
{
Console.WriteLine("前処理中...");
action(); // 渡された処理を実行
Console.WriteLine("後処理完了。");
}
}
Executeメソッドは、どのActionが渡されても同じように処理を流せます。これによりコードの再利用性が高まり、メンテナンスもしやすくなります。
7. ActionとFuncの違い
- Action: 処理を実行するだけで結果を返さない
- Func: 処理を実行して結果(値)を返す
- どちらもメソッドを柔軟に管理するための便利な道具
例えば「料理をする」だけならAction、「料理してカロリーを計算する」ならFuncという違いがあります。
まとめ
ここまで、C#で便利に使うことができるActionとFuncというデリゲートについて、初心者でも迷わず理解できるように順を追って整理してきました。ふだんのプログラムでは、メソッドを呼び出すときに単純にメソッド名を書いて実行することが多いのですが、ActionとFuncを使うと、メソッドそのものをひとつの「値」として扱うことができるので、柔軟な設計や汎用的な処理の組み合わせがとてもやりやすくなります。とくに、処理の切り替え、条件での振り分け、共通処理への引き渡しなど、現場のコードでよく出てくる場面にぴったりです。
Actionは戻り値がない処理をまとめるための仕組みで、代表的な例としては「表示するだけのメッセージ処理」「ファイルへ書き込むだけの処理」「ログを残す処理」など、結果が何も返ってこない操作に向いています。誰が呼び出しても、どの場所から呼び出しても、Action変数へ代入してしまえば同じ手順で扱うことができるので、命令の受け渡しがとても滑らかになります。関数名に縛られないため、柔軟な呼び出しが可能になり、複数のメソッドを入れ替える場合でもコードの見通しがよくなります。
一方、Funcは「引数を受け取って値を返す」という特徴を持っているので、計算や判定など、結果が必要な場面で本当の力を発揮します。足し算、掛け算、文字列処理、検索処理、フィルタリング、スコア算出など、返り値を持つ処理を部品として扱えるため、さまざまな組み立てができるようになります。とくに、同じ引数でも処理の内容だけ差し替えたいときは、Funcの代入を切り替えるだけで済むので、新しいパターンの追加も簡単です。
便利な点は、ActionもFuncも、ラムダ式と組み合わせることでより直感的に書けるところです。メソッド名をわざわざ宣言しなくても、その場に小さな処理を書けるので、コードの量を減らしつつ読みやすさを保つことができます。プログラム全体がコンパクトになり、処理内容が一目でわかりやすくなるので、初心者が学ぶうえでも非常に役立つ表現です。
たとえば、次のコードはActionとFuncをひとつのプログラムにまとめて活用した例です。ここでは、共通の前後処理をひとつにまとめ、渡された処理を差し替えることで、保存処理や計算処理を柔軟に実行できるようにしています。
using System;
class Program
{
static void Main()
{
ExecuteAction(() => Console.WriteLine("設定を保存しました。"));
int total = ExecuteFunc((a, b) => a + b, 10, 20);
Console.WriteLine("計算結果は " + total + " です。");
}
static void ExecuteAction(Action action)
{
Console.WriteLine("前準備中...");
action();
Console.WriteLine("後処理完了。");
}
static int ExecuteFunc(Func<int, int, int> func, int x, int y)
{
Console.WriteLine("計算準備中...");
int result = func(x, y);
Console.WriteLine("計算後処理完了。");
return result;
}
}
こうした構造を用いると、メソッド名やクラス名が増えても迷わず読み進められるうえ、処理を追加したいときにも新しいパターンを簡単に組み込めます。プログラムの設計を丁寧に積み重ねていくほど、ActionとFuncの良さが自然と見えてきます。複雑な分岐を減らし、読みやすく、拡張しやすい構造を形にできるので、少し慣れてきた段階から積極的に触れてみると、書けるコードの幅が大きく広がります。
また、ActionとFuncは、C#のイベント処理や非同期処理とも相性が良く、条件に応じた処理の切り替えや、結果を返すコールバックなどにも活かせます。とくに、サーバーとの通信処理、ファイル読み込み、データ変換など、現場では同じ流れで多くの種類の処理を扱うため、ActionやFuncで統一してしまうと、全体の見通しがとても良くなります。小さなサンプルでも大規模なアプリケーションでも、ActionとFuncが役立つ場面は数多く存在します。
最後に大切なのは、ActionとFuncはあくまで「読みやすいコードのための道具」だという点です。むやみに使うのではなく、処理を整理したいとき、共通化したいとき、柔軟に置き換えたいとき、そういった場面で選択肢のひとつとして考えることで、無理のない形で活用できます。小さな練習でも大丈夫なので、まずは自分で変数に代入して実行してみると、イメージがつかみやすくなります。
生徒
「ActionとFuncって、最初は難しいと思ったけど、使ってみると仕組みがわかりやすくて便利ですね!」
先生
「そうですね。特に、処理を渡すという考え方に慣れると、設計の幅が一気に広がりますよ。」
生徒
「ラムダ式と組み合わせるともっと書きやすくなるのも驚きでした。短くて読みやすいし、追加もしやすいですね!」
先生
「その通りです。処理を引き渡す書き方は、現場でもよく使われるテクニックなんですよ。丁寧に使いこなせば、コード全体がすっきり整理できます。」
生徒
「これからのプログラムづくりで積極的に使ってみたいです!」