導入
「ボタンが押されたら」「在庫が0になったら」——何かが起きたときに、登録しておいた処理を呼び出す仕組みがイベントです。デリゲートを土台に、「通知する側」と「受け取る側」を疎結合につなぎます。
図解
flowchart LR
PUB["発行側 Stock<br/>在庫0で通知を発火"] -->|event| SUB1["購読者A<br/>「発注する」"]
PUB -->|event| SUB2["購読者B<br/>「ログを残す」"]
style PUB fill:#e1f5fe
サンプル
var stock = new Stock();
// += で「通知が来たら実行する処理」を登録(購読)する
stock.SoldOut += () => Console.WriteLine("発注します");
stock.SoldOut += () => Console.WriteLine("ログ: 在庫切れ");
stock.Sell(); // 在庫を減らし、0になったら SoldOut を発火
// 発注します / ログ: 在庫切れ
class Stock
{
private int _count = 1;
public event Action? SoldOut; // イベント(Action 型のデリゲートを土台にする)
public void Sell()
{
_count--;
if (_count == 0)
SoldOut?.Invoke(); // 登録された全処理を呼び出す(発火)
}
}
eventは「何かが起きたときに登録処理を呼ぶ」仕組み(デリゲートが土台)- 購読側は
+= 処理で登録、発行側はイベント?.Invoke()で発火 - 発行側は「誰が聞いているか」を知らずに通知できる=疎結合
演習
var button = new Button();
button.Clicked += () => Console.WriteLine("クリックされました");
button.Press();
// TODO: Clicked イベント(Action 型)を持ち、Press() で Clicked を発火する
// Button クラスを定義してください
___
- 期待される出力:
クリックされました
ヒント1を見る
public event Action? Clicked; と public void Press() => Clicked?.Invoke();
ヒント2を見る
class Button { public event Action? Clicked; public void Press() => Clicked?.Invoke(); }
まとめ
- イベントは「起きたら登録処理を呼ぶ」通知の仕組み
+=で購読、?.Invoke()で発火- 発行側と購読側を疎結合につなぐ(GUIやゲームで多用)
次章: 定番の設計テンプレート「デザインパターン(GoF全23)」へ進みます。