カテゴリ: C# 更新日: 2026/05/05

C#のActionとFuncデリゲートの基本と活用例を初心者向けに完全解説

C#のActionとFuncデリゲートの基本と活用例を紹介
C#のActionとFuncデリゲートの基本と活用例を紹介

先生と生徒の会話形式で理解しよう

生徒

「C#の勉強をしていたら、ActionとかFuncって言葉が出てきました。これは何ですか?」

先生

「ActionとFuncは、C#に用意されている特別なデリゲートです。メソッドを変数のように扱うための仕組みですよ。」

生徒

「メソッドを変数みたいに扱うって、どういうことですか?」

先生

「難しく聞こえますが大丈夫です。身近な例えを使いながら、ActionとFuncの基本からゆっくり説明していきましょう。」

1. デリゲートとは何かを超かんたんに理解しよう

1. デリゲートとは何かを超かんたんに理解しよう
1. デリゲートとは何かを超かんたんに理解しよう

C#のデリゲートとは、「メソッドを入れておける箱」のような仕組みです。 ふつう変数には数値や文字を入れますが、デリゲートには処理そのものを入れることができます。

たとえば「挨拶する処理」や「計算する処理」を、あとから呼び出せるように保存しておくイメージです。 この仕組みを使うと、プログラムが柔らかくなり、同じコードを何度も書かずにすみます。

2. Actionデリゲートとは?戻り値のない処理を表す

2. Actionデリゲートとは?戻り値のない処理を表す
2. Actionデリゲートとは?戻り値のない処理を表す

Actionデリゲートは、「何か処理をするけれど、結果を返さない」メソッドを表します。 「表示する」「ログを出す」「お知らせする」など、結果が不要な処理によく使われます。

Actionは、引数を受け取ることはできますが、最後に値を返しません。 この「返さない」という点が、初心者の方がまず覚えておく大切なポイントです。


Action showMessage = () =>
{
    Console.WriteLine("こんにちは、C#のActionです。");
};

showMessage();

上の例では、「画面に文字を表示する処理」をActionに入れています。


こんにちは、C#のActionです。

3. 引数付きActionで処理を柔軟にする

3. 引数付きActionで処理を柔軟にする
3. 引数付きActionで処理を柔軟にする

Actionは、データを受け取って処理することもできます。 これを引数と呼びます。引数とは、処理に渡す材料のことです。


Action<string> greet = name =>
{
    Console.WriteLine(name + "さん、こんにちは。");
};

greet("田中");

田中さん、こんにちは。

このようにActionを使うと、「表示する内容だけを後から変える」といった柔軟な書き方ができます。

4. Funcデリゲートとは?結果を返す処理を表す

4. Funcデリゲートとは?結果を返す処理を表す
4. Funcデリゲートとは?結果を返す処理を表す

Funcデリゲートは、Actionとは違い「処理をして、結果を返す」メソッドを表します。 計算結果を使いたいときや、判断した結果を受け取りたいときに使われます。

Funcの特徴は、最後の型が戻り値になる点です。 ここが最初は少しややこしく感じるかもしれません。


Func<int, int, int> add = (a, b) =>
{
    return a + b;
};

int result = add(3, 5);
Console.WriteLine(result);

8

5. ActionとFuncの違いをイメージで理解しよう

5. ActionとFuncの違いをイメージで理解しよう
5. ActionとFuncの違いをイメージで理解しよう

ActionとFuncの違いはとてもシンプルです。

  • Action:処理はするが、答えは返さない
  • Func:処理をして、答えを返す

電話のアナウンスのように「伝えるだけ」ならAction、 電卓のように「計算して結果を出す」ならFuncと考えると分かりやすいでしょう。

6. ラムダ式と組み合わせるとコードが短くなる

6. ラムダ式と組み合わせるとコードが短くなる
6. ラムダ式と組み合わせるとコードが短くなる

ActionやFuncは、ラムダ式と一緒に使われることが多いです。 ラムダ式とは、処理を短く書くための記法です。

難しく感じる場合は、「短く書ける書き方」と覚えておけば大丈夫です。


Action sayHello = () => Console.WriteLine("Hello");
sayHello();

Hello

7. ActionとFuncがよく使われる場面

7. ActionとFuncがよく使われる場面
7. ActionとFuncがよく使われる場面

ActionとFuncは、ボタンを押したときの処理や、データを順番に処理するときなど、 さまざまな場面で使われます。

特に「処理だけを渡したい」「計算方法を後から変えたい」といった場合に力を発揮します。 この考え方を覚えると、C#のコードが一気に読みやすくなります。

まとめ

まとめ
まとめ

今回はC#におけるActionとFuncデリゲートについて、基礎から実用的な使い方までを丁寧に振り返りました。デリゲートという概念は最初は少し難しく感じるかもしれませんが、本質はとてもシンプルであり、処理そのものを変数のように扱える便利な仕組みです。これを理解することで、プログラムの柔軟性や再利用性が大きく向上します。

Actionは戻り値を持たない処理を表現するためのデリゲートであり、画面表示やログ出力など結果を返す必要がない場面で活躍します。一方でFuncは戻り値を持つ処理を表現するためのデリゲートであり、計算処理や条件判定など結果を利用したい場面で非常に重要な役割を果たします。この違いを明確に理解しておくことが、実務でのコード設計において大きな武器になります。

また、引数を受け取ることで処理をより柔軟に変化させることができる点も重要です。同じ処理の形を保ちながら、中身だけを変更できるため、重複コードを減らし保守性の高いプログラムを書くことができます。これは大規模なシステム開発において特に効果を発揮します。

さらにラムダ式と組み合わせることで、コードを簡潔に書くことができる点も見逃せません。従来のメソッド定義と比べて、短く直感的に処理を書けるため、可読性の向上にもつながります。特にコレクション操作やイベント処理においては、ActionやFuncとラムダ式の組み合わせは頻繁に登場します。

実際の開発現場では、ボタン押下時の処理やデータのフィルタリング、並び替え、非同期処理など、さまざまな場面でこれらのデリゲートが使われています。単なる知識として覚えるのではなく、どのような場面で使うと便利なのかをイメージしながら理解することが大切です。

次に、今回学んだ内容を実際のコードで振り返ってみましょう。ここではActionとFuncを組み合わせた簡単なサンプルを紹介します。処理を外から渡すことで、同じ構造の中で異なる動作を実現できることが分かります。


using System;

class Program
{
    static void Execute(Action action)
    {
        Console.WriteLine("処理を開始します");
        action();
        Console.WriteLine("処理を終了します");
    }

    static int Calculate(Func<int, int, int> func, int a, int b)
    {
        return func(a, b);
    }

    static void Main()
    {
        Execute(() =>
        {
            Console.WriteLine("これはActionの処理です");
        });

        int result = Calculate((x, y) => x * y, 4, 5);
        Console.WriteLine("計算結果は " + result + " です");
    }
}

処理を開始します
これはActionの処理です
処理を終了します
計算結果は 20 です

このようにActionとFuncを使うことで、処理の流れを固定しながら中身だけを差し替えることが可能になります。この考え方は設計の自由度を高め、拡張しやすいコードを書くための重要なテクニックです。

C#のデリゲートをしっかり理解しておくと、イベント駆動プログラミングや非同期処理、さらには高度な設計パターンにも対応できるようになります。最初は小さなサンプルからでも構いませんので、実際にコードを書いて動かしながら理解を深めていくことをおすすめします。

先生と生徒の振り返り会話

生徒

ActionとFuncの違いがやっと分かってきました 処理をするだけか 結果を返すかの違いなんですね

先生

その通りです その違いを意識できるだけで コードの理解力はかなり上がりますよ

生徒

ラムダ式と一緒に使うとすごく短く書けるのも便利ですね

先生

はい 実務ではその書き方がよく使われます 特に一覧データの処理やイベント処理では頻出です

生徒

処理を引数として渡せるというのが最初は不思議でしたが 今は少し理解できました

先生

とても良い理解です その考え方に慣れると 設計の幅が大きく広がります

生徒

これからは自分でもActionとFuncを使ってコードを書いてみます

先生

ぜひ実際に手を動かしてみてください 経験を積むことで自然と使いこなせるようになります

カテゴリの一覧へ
新着記事
New1
COBOL
COBOLシステムのセキュリティを強化する!セキュリティベンダーとの連携と管理のコツ
New2
COBOL
COBOLのプログラム分割とパフォーマンスの関係をやさしく解説!初心者でも理解できる構造化プログラミング入門
New3
COBOL
COBOLのモジュール化の基本設計を完全ガイド!初心者でもわかる保守性と可読性の向上テクニック
New4
C#
C#セキュリティ対策完全ガイド!初心者向けアプリ開発の脆弱性対策とベストプラクティス
人気記事
No.1
Java&Spring記事人気No1
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.2
Java&Spring記事人気No2
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.3
Java&Spring記事人気No3
C#
C#のbool型を完全解説!初心者でもわかるtrueとfalseの基本と使い方
No.4
Java&Spring記事人気No4
C#
C#のトランザクション処理を完全ガイド!初心者でもわかるCommit・Rollbackの使い方
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.7
Java&Spring記事人気No7
Azure
Azureストレージの冗長性比較!LRS/GRS/ZRSの選び方とコストの最適解を完全解説
No.8
Java&Spring記事人気No8
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本