-
Notifications
You must be signed in to change notification settings - Fork 0
MS_MultipleAndMulticastEvents
nishi_74322014 edited this page Sep 1, 2026
·
1 revision
- 戻る(.NET開発)
- マルチプル・イベントとマルチキャスト・イベント
- Windows Forms
- ASP.NET Web Forms
- マルチプル・デリゲートによって実現されるイベント
- 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を返す慣習はこのためでもある)。- 解除漏れ:
+=したまま-=しないと、
購読側のオブジェクトが発行側から参照され続けて
解放されない(イベント経由のメモリ リーク)。
メモリ管理も参照。
-
イベントの処理と発生 | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/standard/events/ -
デリゲート - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
https://ufcpp.net/study/csharp/sp_delegate.html -
マルチキャストデリゲート - C# 入門
https://csharp.keicode.com/basic/delegates-multicast.php
Tags: .NET開発, UIサブシステム, Windows Forms, ASP.NET Web Forms
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。