本文へスキップ
BecomeCoder

C#オブジェクト指向コース · 第4章 ジェネリクスとデリゲート · レッスン33

イベント(event)

ブラウザで完結

導入

「ボタンが押されたら」「在庫が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)」へ進みます。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。