【C#】デリゲートとイベントの仕組みをわかりやすく解説

C# の「デリゲート」と「イベント」は、オブジェクト間で通知やコールバックを行う仕組みを構築するための基本要素です。GUI アプリケーションや非同期処理、カスタムライブラリの設計など、実務でも広く活用されます。本記事では、デリゲートとイベントの仕組みをわかりやすく解説します。

デリゲートとは?

デリゲート(delegate)は「メソッドを参照する型」です。メソッドを変数のように扱え、必要なときに呼び出すことができます。C# でいう「関数ポインタ」に相当します。

using System;

public delegate void GreetDelegate(string name);

class Program
{
    static void Greet(string name)
    {
        Console.WriteLine($"Hello, {name}");
    }

    static void Main()
    {
        // デリゲートにメソッドを代入
        GreetDelegate del = Greet;

        // デリゲートを通じて呼び出し
        del("Taro"); // 出力: Hello, Taro
    }
}

デリゲートを使うことで、メソッドを引数として渡したり、動的に切り替えることが可能になります。

デリゲートのマルチキャスト

デリゲートは複数のメソッドを登録(多重代入)でき、呼び出し時には順番に実行されます。これを「マルチキャストデリゲート」と呼びます。

void Hello(string name) => Console.WriteLine($"Hello, {name}");
void Bye(string name) => Console.WriteLine($"Goodbye, {name}");

GreetDelegate del = Hello;
del += Bye;

del("Hanako");
// 出力:
// Hello, Hanako
// Goodbye, Hanako

イベントとは?

イベントは「デリゲートを利用した通知の仕組み」です。event キーワードを使うことで、外部からの直接呼び出しを禁止し、安全に購読(subscribe)・解除(unsubscribe)ができます。

using System;

public class Button
{
    // イベントの宣言
    public event Action Clicked;

    public void Click()
    {
        Console.WriteLine("ボタンが押されました");
        Clicked?.Invoke(); // 登録された処理を呼び出す
    }
}

class Program
{
    static void Main()
    {
        var button = new Button();

        // イベントにメソッドを登録
        button.Clicked += () => Console.WriteLine("処理1が実行されました");
        button.Clicked += () => Console.WriteLine("処理2が実行されました");

        button.Click();
        // 出力:
        // ボタンが押されました
        // 処理1が実行されました
        // 処理2が実行されました
    }
}

event を付けることで、外部から Clicked() を直接呼ぶことはできず、イベントの購読と解除だけが可能になります。これにより「通知する側」と「通知される側」の役割が明確になります。

デリゲートとイベントの違い

項目 デリゲート イベント
目的 メソッド参照の保持と呼び出し 通知の仕組みを提供
外部からの呼び出し 可能(デリゲート変数を直接呼べる) 不可(event で制御)
利用シーン コールバックやメソッド切り替え イベント駆動プログラミング(UI・非同期通知)

まとめ

C# のデリゲートとイベントは次のように理解するとシンプルです。

  • デリゲート … メソッドを参照・呼び出せる仕組み
  • イベント … デリゲートを利用して「購読/通知」を安全に行う仕組み

イベント駆動型の設計ではデリゲートとイベントが不可欠です。基本を理解し、GUI や非同期処理、カスタム通知の実装に活用してみましょう。