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

C#のデリゲートとは?基本の仕組みと使い方を解説

C#のデリゲートとは?基本の仕組みと使い方を解説
C#のデリゲートとは?基本の仕組みと使い方を解説

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

生徒

「C#のデリゲートって何に使うものなんですか?」

先生

「デリゲートは、メソッドを変数のように扱うためのしくみです。」

生徒

「メソッドを変数みたいに扱うってどういうことですか?想像できません…」

先生

「例えば、ゲームで『攻撃』『回復』『防御』など、状況で実行する操作を切り替えたい場合に、とても便利なんですよ。」

生徒

「なるほど!もっと詳しく知りたいので教えてください!」

1. C#のデリゲートとは?

1. C#のデリゲートとは?
1. C#のデリゲートとは?

デリゲート(delegate)とは、C#でメソッド(処理のまとまり)を指し示して、あとから呼び出すための型のことです。メソッドを箱に入れて持ち運ぶようなイメージです。普通はメソッド名を直接書いて呼び出しますが、デリゲートを使うと、どのメソッドを動かすかを柔軟に切り替えられます。

状況によって実行するメソッドが変わる場合に、とても役立ちます。プログラムをより柔軟にし、後から変更しやすくする効果があります。C#のラムダ式やイベント処理とも強く関係している重要な技術です。

2. デリゲートの基本的な書き方

2. デリゲートの基本的な書き方
2. デリゲートの基本的な書き方

まず最初は、デリゲートがどのように宣言されるのかを見てみましょう。デリゲートは、戻り値と引数の型を指定して宣言します。


delegate void MessageDelegate(string message);

上記は、string型の引数を1つ受け取り、戻り値がない(void)メソッドを入れられるデリゲートです。

3. デリゲートにメソッドを登録して実行する例

3. デリゲートにメソッドを登録して実行する例
3. デリゲートにメソッドを登録して実行する例

実際にメソッドを登録し、実行してみるサンプルを見てみましょう。


using System;

delegate void MessageDelegate(string message);

class Program
{
    static void SayHello(string msg)
    {
        Console.WriteLine("こんにちは! " + msg);
    }

    static void Main()
    {
        MessageDelegate del = SayHello;
        del("C#デリゲートの世界へようこそ!");
    }
}

実行結果:


こんにちは! C#デリゲートの世界へようこそ!

この例では、SayHelloメソッドをMessageDelegate型の変数delに登録し、delとして実行しています。つまり、delを呼び出すとメソッドSayHelloが動きます。これが「メソッドを変数のように扱う」という意味です。

4. デリゲートが役に立つ場面の例

4. デリゲートが役に立つ場面の例
4. デリゲートが役に立つ場面の例

デリゲートは、次のようなシーンでとても便利です。

  • 操作の種類を切り替える処理(ゲームの攻撃・回復の切替など)
  • 処理をまとめて実行したいとき
  • イベント処理(ボタンクリック等)
  • プラグイン方式の仕組み

例えば、ゲームのキャラクターの行動を変更するイメージを考えてみましょう。


delegate void ActionDelegate();

static void Attack() { Console.WriteLine("攻撃した!"); }
static void Heal() { Console.WriteLine("回復した!"); }

static void Main()
{
    ActionDelegate action = Attack;
    action();   // 攻撃

    action = Heal;
    action();   // 回復
}

攻撃した!
回復した!

状況に応じて、同じ変数actionに入れるメソッドを変更できるので、コードを大きく書き換える必要がありません。これがデリゲートの大きなメリットです。

5. デリゲートを理解するための例え

5. デリゲートを理解するための例え
5. デリゲートを理解するための例え

デリゲートは「テレビのリモコン」に例えると分かりやすいです。リモコンは本体から離れていてもチャンネルを操作できます。リモコンはテレビにどのボタンを押したかを伝えますが、どの番組を映すかはその時次第で変えられます。デリゲートは、この「ボタンの指示」を預かる役割をしています。

つまり、どのメソッドを実行するかを後から選べる「メソッドのリモコン」がデリゲートです。

まとめ

まとめ
まとめ

ここまでC#のデリゲート(delegate)の基本概念から具体的なコードの実装方法、そして実務やゲーム開発でどのように活用されるのかについて詳しく解説してきました。デリゲートは一見すると「なぜ直接メソッドを呼び出さないのか?」と疑問に思うかもしれませんが、プログラムの柔軟性を高めるためには欠かせない存在です。

デリゲートの本質的なメリット

デリゲートを導入する最大のメリットは、「呼び出し側」と「実行される処理」を切り離せる(疎結合にする)ことにあります。例えば、ボタンをクリックしたときの処理を考えてみましょう。ボタンという部品自体は、将来どのような処理が追加されるかを知りません。しかし、デリゲートという「枠組み」を用意しておくことで、開発者は後から好きな処理をボタンに割り当てることができるようになります。

マルチキャストデリゲートによる一括処理

デリゲートの強力な機能の一つに、複数のメソッドをまとめて登録できる「マルチキャストデリゲート」があります。+= 演算子を使うことで、一つのデリゲート変数に複数のメソッドを紐付け、一回の呼び出しで全ての処理を順番に実行させることが可能です。


using System;

namespace DelegateSummary
{
    // メッセージを表示するためのデリゲート宣言
    public delegate void Notification(string text);

    class Program
    {
        static void ShowAlert(string text) => Console.WriteLine($"[アラート]: {text}");
        static void Logging(string text) => Console.WriteLine($"[ログ記録]: {text} を保存しました。");

        static void Main(string[] args)
        {
            // 複数のメソッドを登録する(マルチキャスト)
            Notification notify = ShowAlert;
            notify += Logging;

            Console.WriteLine("システム実行中...");
            // 登録されたすべてのメソッドが実行される
            notify("不正なアクセスを検知しました。");

            // 特定のメソッドだけ解除することも可能
            notify -= ShowAlert;
            Console.WriteLine("\nアラートを解除後の実行:");
            notify("定期メンテナンスの時間です。");
        }
    }
}

実行結果:


システム実行中...
[アラート]: 不正なアクセスを検知しました。
[ログ記録]: 不正なアクセスを検知しました。 を保存しました。

アラートを解除後の実行:
[ログ記録]: 定期メンテナンスの時間です。 を保存しました。

現代的なC#開発とデリゲートの進化

現在のC#開発では、今回紹介した delegate キーワードを直接定義する機会は減ってきています。その代わりに、.NET Frameworkが標準で用意している Action(戻り値なし)や Func(戻り値あり)といった汎用デリゲート、さらには簡潔に処理を記述できる「ラムダ式」が主流となっています。しかし、これら全ての技術の根底にあるのはデリゲートの仕組みです。基礎をしっかり理解しておくことで、イベントハンドラやLINQといった高度な機能もスムーズに習得できるでしょう。

オブジェクト指向プログラミングにおいて、処理を動的に差し替える手法は「デザインパターン」としても重宝されます。デリゲートをマスターして、よりスマートでメンテナンス性の高いC#コードを目指しましょう。

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

生徒

「先生、まとめまで読んでデリゲートの凄さがだんだん分かってきました。メソッドを『変数』として持ち運べるから、後から中身を入れ替えたり、追加したりできるんですね!」

先生

「その通りです。特に追加・削除ができる『マルチキャストデリゲート』は、通知機能やログ出力のような複数の場所に同じ情報を送りたいときにとても重宝しますよ。」

生徒

「さっきのコード例だと、アラートを出したりログを取ったりする処理を、呼び出し側が意識せずに一度に実行できていましたね。これって、もしデリゲートを使わなかったら、毎回メソッドを並べて書かないといけないんですよね?」

先生

「ええ。もしデリゲートを使わなければ、条件分岐(if文やswitch文)だらけの複雑なコードになっていたでしょう。デリゲートを使うことで、『何をいつ実行するか』をメインのロジックから切り離して、スッキリ整理できるのが最大のメリットなんです。」

生徒

「なるほど。ところで先生、さっき『Action』とか『Func』っていう名前が出てきましたが、あれもデリゲートの一種なんですか?」

先生

「鋭いですね! delegate void MyDelegate() と自分で宣言しなくても済むように、C#があらかじめ用意してくれている便利なテンプレートのようなものです。基本は今回の記事で学んだことと同じなので、自信を持ってください。」

生徒

「基礎がわかっていれば、新しい書き方が出てきても怖くないですね。デリゲートを使いこなして、もっと拡張性の高いプログラムを書いてみたいと思います!」

先生

「その意気です。次はデリゲートをさらに進化させた『イベント(event)』や『ラムダ式』についても学んでいきましょう。表現の幅がグッと広がりますよ。」

カテゴリの一覧へ
新着記事
New1
C#
C#正規表現完全ガイド!数値チェックやメールアドレス検証の書き方
New2
Azure
Azure導入のメリット・デメリットとは?DX推進を成功させる経営層への提案術
New3
C#
C#のvarキーワードとは?暗黙的型指定の使いどころを解説
New4
COBOL
COBOLのファイル入出力のエラーと解決策まとめ!初心者向けやさしく解説
人気記事
No.1
Java&Spring記事人気No1
COBOL
COBOLのバッチ処理とは?基本構成と役割を初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
COBOL
COBOLのコンパイラと開発環境を徹底解説!初心者にもわかりやすい入門ガイド
No.4
Java&Spring記事人気No4
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.7
Java&Spring記事人気No7
C#
C#のasyncとawaitの基本的な使い方をマスターしよう!非同期処理をやさしく解説
No.8
Java&Spring記事人気No8
C#
C#でNewtonsoft.Jsonを使いこなす!初心者向けJSON操作とデシリアライズ完全解説