スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
デリゲートとは?
デリゲートを使うことで、メソッドの参照情報を格納するための型を作成することができます。
デリゲートを宣言する際には、メソッドと同様に、戻り値と引数を指定する必要があります。
デリゲートは以下のように宣言します。
アクセス修飾子delegate 戻り値の型 デリゲート名(引数);
戻り値と引数の組み合わせが異なるメソッドに対して、同じデリゲート型で扱うことはできません。
※デリゲートは異なる引数の組み合わせに対して同じ名称を割り振ることができません。メソッドでできたオーバーロードみたいなことはできません。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Del05 { class Program { delegate void Del(); static void Hello() { Console.WriteLine("こんにちは"); } static void Morning() { Console.WriteLine("おはようございます"); } static void Main(string[] args) { Del message; //1回目 message = Hello; message(); //2回目 message = Morning; message(); } } } |
実行結果
こんにちは
おはようございます
delegate void Del();
という部分で、戻り値がない(void)で、引数もないDelという名前のデリゲート型を定義しています。
Del message;
Del型で名前がmessageという変数を宣言しています。
message = Hello;
変数messageに対して、メソッド(ここでは、Hello)を代入しています。
この一連の流れは、以下のようなint型の変数iを宣言して、iに対して値(ここでは20)を代入するのと似ています。
int i;
i = 20;
int型の場合と異なる点は2つあります、
・値でなくメソッドの参照情報を扱うこと
・最初に、自分で型を定義する必要があること
message();
デリゲートを介して、メソッドが実行されます。1回目はHelloメソッド、2回目はMorningメソッドが実行されます。
デリゲートの宣言の仕方
Del message;
message = Hello;
というコードは以下のように書き換えられます。
Del message=Hello;
この書き方は、int型の類推で理解できると思います。
C#2.0より前(つまりC#1.1)では、上のような書き方はできません。
そのため、古いコードでは以下のように書かれている場合があります。
Del message = new Del(Hello);
newを使用して、デリゲートをインスタンス化しています。
デリゲートの応用例
デリゲートを使用することでメソッドの引数にメソッドが使えるようになります。
つまり、メソッドに対して、他のメソッドを引き渡すことができます、
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Del06 { class MyClass { public int Half(int i) { return i / 2; } public int Minus(int i) { return -i; } } class Program { delegate int Del(int i); static void Message(Del calc, int i) { Console.WriteLine("結果は" + calc(i)); } static void Main(string[] args) { MyClass mc = new MyClass(); Message(mc.Minus, 2); Message(mc.Half, 10); //Del calc; //calc = mc.Minus; //Console.WriteLine("結果は" + calc(2)); //calc = mc.Half; //Console.WriteLine("結果は" + calc(10)); } } } |
実行結果
結果は-2
結果は5
Messageメソッドは、最初の引数でデリゲートを受け取ります。このデリゲートを通して、メソッドの参照情報を扱います。
Message(mc.Minus, 2);
Message(mc.Half, 10);
このコードをMessageメソッドを使わずに書くと、以下のようになります。
Del calc;
calc = mc.Minus;
Console.WriteLine(“結果は” + calc(2));
calc = mc.Half;
Console.WriteLine(“結果は” + calc(10));
~プログラミングを勉強してみませんか?~
TechAcademy [テックアカデミー] は無料の体験講座が用意されているので、気軽に体験できます。
※私(サイト主)も無料体験講座を実際に受けてみました(→感想)