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 や非同期処理、カスタム通知の実装に活用してみましょう。