マルチキャストデリゲート

デリゲートの基本」ではデリゲート f1 はひとつのメソッドを参照していました。

しかし、デリゲートは複数の呼び出しをサポートしています。これを マルチキャストデリゲート (multicast delegate) といいます。

デザインパターンにおけるいわゆる Publisher-Subscriber パターンでは一般に複数の購読者をサポートすることが要求されますが、 マルチキャストデリゲートによって、ちゃんと複数の Subscriber をサポートできることになります。

まずテストのために使う Class1 は以前と同じ次の通りです。

using System;

namespace DelegateTest1
{
	class Class1
	{
		public delegate void f1Delegate();
		public f1Delegate f1;

		public void Test()
		{
			if (f1 != null)
			{
				f1();
			}
		}
	}
}

マルチキャストデリゲートのためには、次のように複数のデリゲートを設定します。

using System;

namespace DelegateTest1
{
	class Program
	{
		static void Main(string[] args)
		{
			Class1 c1 = new Class1();
c1.f1 = new Class1.f1Delegate(a); c1.f1 += new Class1.f1Delegate(b);
c1.Test(); } static void a() { Console.WriteLine("I'm a()."); } static void b() { Console.WriteLine("I'm b()."); } } }

ここでデリゲートの呼び出しリスト (invocation list) にメソッド b を追加するときに、+= を利用していることに注意してください。 += とすることによって、呼び出しリストに b が「追加」されます。

ここで = とすると、呼び出しリストは初期化され、b だけになるため、メソッド a は呼び出されません。

実行結果は次の通り

I'm a().
I'm b().

+= は Combine を呼んでいる

+= でインボケーションリストにデリゲートを追加しました。これは次のコードと同様です。

using System;

namespace DelegateTest1
{
	class Program
	{
		static void Main(string[] args)
		{
			Class1 c1 = new Class1();
			c1.f1 = new Class1.f1Delegate(a);
c1.f1 = (Class1.f1Delegate) Delegate.Combine( c1.f1, new Class1.f1Delegate(b));
c1.Test(); } static void a() { Console.WriteLine("I'm a()."); } static void b() { Console.WriteLine("I'm b()."); } } }

System.Delegate の Combine メソッドを利用すると、特定のデリゲートのインボケーションリストにデリゲートを追加できます。 += と表記することで裏では Combine メソッドを呼んでいます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 C# 入門