マルチキャストデリゲートとは?解説と具体例(C#)

  • このエントリーをはてなブックマークに追加

スポンサーリンク

※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~

マルチキャストデリゲートとは?

デリゲートは、複数のメソッドの参照情報を格納できます。

マルチキャストデリゲートを使用することで、デリゲートを介して、複数のメソッドをまとめて実行できます

マルチキャストデリゲートに、デリゲートインスタンスを追加する場合は「+」演算子を使用します。

逆に、登録したデリゲートインスタンスを1つ削除する場合は、「-」演算子を使用します。

削除したいデリゲートインスタンスが、同一名称かつ複数ある場合は、その数だけ「-」演算子が必要になります。

削除する時は、新しく追加されたデリゲートインスタンスから順番に削除されていきます。

万が一、あるデリゲートインスタンスに対して、過剰に削除してもエラーにはなりません。

ただし、全てのデリゲートインスタンスを削除した状況で、登録したメソッドを呼び出そうとすると、以下のようなエラーが起きます。

ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

ソースコード

実行結果

1回目
こんにちは
こんにちは
おはようございます
こんにちは
こんにちは
2回目
こんにちは
こんにちは
おはようございます
こんにちは
3回目
こんにちは
こんにちは
こんにちは

 

message += Hello;

このような書き方だと、メソッドを追加しているように見えますが、正確に言えば、メソッドを参照しているデリゲートインスタンスを追加しています。

そのため、上のコードは以下のようなコードの簡易表現したコードになります。

message += new Del(Hello);

同じデリゲート型の演算

同じデリゲート型同士で「+」「-」演算子の使用は可能です。

ただし、戻り値と引数が同じもデリゲート名が異なれば、異なる型だと認識され、「+」「-」演算子は使用できません。

ソースコード

実行結果

こんにちは
おはようございます

戻り値のあるメソッドに対して、マルチキャストを使用する場合

戻り値のあるメソッドに対して、「+」演算子を使って、複数のメソッドを束ねたとします。

この戻り値のある複数のメソッドを呼び出し場合、最後のメソッドの戻り値が最終的な結果となります。

ソースコード

実行結果

おはようございます

Morningメソッドのみ最終的な結果に反映されています。Helloメソッドの結果は表には現れません。

このように戻り値のある場合に、マルチキャストデリゲートを使用しても、あまりメリットがありません。

そのため、マルチキャストデリゲートを使用する場合は、戻り値がvoid型であることが多いです。

~プログラミングを勉強してみませんか?~

TechAcademy [テックアカデミー] 無料の体験講座が用意されているので、気軽に体験できます。

※私(サイト主)も無料体験講座を実際に受けてみました(→感想)

     

コメントを残す

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)