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)ですが引数で異なるクラスのメソッドを指定しています。
関連の記事