C# デリゲートのサンプル

C#のデリゲートのサンプルです。

目次

サンプル デリゲートとは
  デリゲートにインスタンスのメソッドを登録する
  デリゲートに静的メソッドを登録する
  デリゲートに匿名メソッドを登録する
  デリゲートに複数のメソッドを登録する/削除する
  ポリモフィズム的に使用する

デリゲートとは

delegate 戻り値の型 名称 (引数)
  • デリゲートに、メソッドを登録できます。
    →登録するメソッドは、delegateの引数と戻り値の型に一致している必要があります。
    →メソッドは、デリゲートの変数を通して実行されます。
  • デリゲートにメソッドを=で代入した場合は、メソッドの上書きになります。
  • デリゲートにメソッドを+=で代入した場合は、メソッドの追加になります。
    →メソッドを2つ追加した場合、メソッドが連続して実行されます。
  • デリゲートにメソッドを-=で代入した場合は、メソッドの削除になります。
  • delegeteキーワードを使用します。
  • 以下は、Microsoftのデリゲートのリンクです。
    https://docs.microsoft.com/ja-jp/dotnet/csharp/delegates-overview

デリゲートにインスタンスのメソッドを登録する

デリゲートにインスタンスのメソッドを登録するサンプルです。

using System;

delegate void delegate1(int num1, int num2);

class Class1
{
	public void Print1(int a, int b)
	{
		Console.WriteLine(a * b);
	}
}
class Test1
{
	public static void Main()
	{
		Class1 c1 = new Class1();
		delegate1 d1 = c1.Print1;
		d1(2, 3); // 6
	}
}

3行目は、デリゲートを定義しています。
17行目は、7行目のメソッドをデリゲートに登録しています。
18行目は、デリゲートの変数でメソッドを実行しています。

デリゲートに静的メソッドを登録する

デリゲートに静的メソッドを登録するサンプルです。

using System;

delegate void delegate1(int num1, int num2);

class Class1
{
	public static void Print1(int a, int b)
	{
		Console.WriteLine(a * b);
	}
}
class Test1
{
	public static void Main()
	{
		delegate1 del1 = new delegate1(Class1.Print1);
		del1(2, 3); //6
	}
}

3行目は、デリゲートを定義しています。
7行目は、staticがあるので静的メソッドです。
16行目は、7行目のメソッドをデリゲートに登録しています。
17行目は、デリゲートの変数でメソッドを実行しています。

デリゲートに匿名メソッドを登録する

using System;

delegate void delegate1(int num1, int num2);

class Test1
{
	public static void Main()
	{
		delegate1 d1 = delegate(int a,int b){ Console.WriteLine(a * b);};
		d1(2, 3); // 6
	}
}

9行目は、メソッド名がない匿名メソッドです。

デリゲートに複数のメソッドを登録する/削除する

デリゲートに複数のメソッドを登録する/削除するサンプルです。

using System;

delegate void delegate1(int num1, int num2);

class Class1
{
	public static void Print1(int a, int b)
	{
		Console.WriteLine(a * b);
	}
	public static void Print2(int a, int b)
	{
		Console.WriteLine(a * b + 100);
	}
}
class Test1
{
	public static void Main()
	{
		delegate1 del1 = new delegate1(Class1.Print1);
		del1 += new delegate1(Class1.Print2);
		del1(2, 3); //6 106が表示される

		del1 -= new delegate1(Class1.Print1);
		del1(2, 3); //106が表示される
	}
}

20行目は、1つめのメソッドをデリゲートに登録しています。
21行目は、+=で2つめのメソッドをデリゲートに登録しています。
22行目の実行で数値が2つ出力されます。

24行目は、-=で指定したメソッドをデリゲートから削除しています。

ポリモフィズム的に使用する

デリゲートをメソッドの引数のデータ型にしてポリモフィズム的に使用できます。

using System;

delegate void delegate1(int num1, int num2);

public class Class1
{
	public void print1(int a, int b)
	{
		Console.WriteLine(a * b);
	}
}
public class Class2
{
	public void print1(int a, int b)
	{
		Console.WriteLine(a + b);
	}
}
class TestA
{
	public static void exe01(delegate1 del1,int a,int b)
	{
		del1(a,b);
	}
	static void Main()
	{
		Class1 c1 = new Class1();
		Class2 c2 = new Class2();
		exe01(c1.print1, 2,3); // 6
		exe01(c2.print1, 3,4); // 7
	}
}

21行目の1つめの引数のデータ型はdelegateです。
29,30行目は、同じメソッド名(exe01)ですが引数で異なるクラスのメソッドを指定しています。

関連の記事

C# メソッドのサンプル(値渡し/参照渡し他)

△上に戻る