Skip to content

MS_MultipleAndMulticastEvents

nishi_74322014 edited this page Sep 1, 2026 · 1 revision

マルチプル・イベントとマルチキャスト・イベント

概要

マルチプル・イベント

  • マルチプル・デリゲートによって実現されるイベント
  • 1 つのイベントハンドラを複数のコントロール・イベントから呼び出すことができる。

マルチキャスト・イベント

  • マルチキャスト・デリゲートによって実現されるイベント
  • 1 つのコントロール・イベントに複数のイベントハンドラを呼び出すことができる。

補足(用語の整理): 「マルチプル・デリゲート」は
一般的な .NET の用語ではなく、本ページ独自の対比のための呼び方である
(BCL のドキュメントに現れるのは「マルチキャスト デリゲート」のみ)。
実際には、どちらも同じ Delegate の仕組みの使い方の向きが違うだけである。

対応関係 実装イメージ
マルチプル・イベント 多 対 1(複数のイベント → 1 つのハンドラ) 複数のコントロールの Click に同じメソッドを登録し、sender で分岐する
マルチキャスト・イベント 1 対 多(1 つのイベント → 複数のハンドラ) 同じイベントに += を重ねる
// マルチプル:3 つのボタンで 1 つのハンドラを共有
button1.Click += Button_Click;
button2.Click += Button_Click;
button3.Click += Button_Click;

private void Button_Click(object sender, EventArgs e)
{
    var button = (Button)sender;   // どれが押されたかは sender で判別
}

// マルチキャスト:1 つのイベントに 2 つのハンドラ
button1.Click += SaveHandler;
button1.Click += LogHandler;       // 登録順に呼ばれる

詳細

移行メモ(未記述): 「詳細」節は元ページでも「...」のみで、
内容が書かれていない。

補足(マルチキャストの注意点): 1 つのイベントに複数のハンドラを
登録する場合、次の点に注意する。

  • 例外:途中のハンドラが例外を投げると、
    それ以降のハンドラは呼ばれない
    全部呼びたい場合は GetInvocationList() で 1 つずつ回して
    個別に try/catch する。
  • 戻り値:戻り値のあるデリゲートを マルチキャストすると、
    最後のハンドラの戻り値しか取れない
    (イベントのハンドラが void を返す慣習はこのためでもある)。
  • 解除漏れ+= したまま -= しないと、
    購読側のオブジェクトが発行側から参照され続けて
    解放されない(イベント経由のメモリ リーク)。
    メモリ管理も参照。

参考

本 Wiki 内


Tags: .NET開発, UIサブシステム, Windows Forms, ASP.NET Web Forms

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally