Contents
デリゲート
メソッドの処理内容はさておき、先にメソッドの引数型と戻り値型を定義して、後でそのメソッドの実体をセットして使用するのをデリゲートと言います。これにより、メソッド名を変数の様に扱い、そのメソッドを実行できます。
↑変数にメソッドを代入する事ができる様になります。
定義
[修飾子] delegate 戻り値の型 デリゲート名(引数の型 引数, …)
つまり、戻り値、引数が同じ型のメソッドがいくつかあった場合、変数を扱うかの如きに各メソッドを呼び出す事が可能となります。
引数部分は各メソッド同じ型となります。・・・A(1),B(2)
解釈
デリゲートの基本です。
ex.1)delegate void TestDelegate(int a);//型宣言
解釈・・・TestDelegate型は①引数(int)で②戻り値無しのメソッドを参照するdelegate型です。そんな関数を変数として扱える様にインスタンスを作ります。
delegate int StrInt(string s);//型宣言
ex.2)①引数がstringで②戻り値がintのメソッドを参照するdelegate型です。
そんな(引数や戻り値を持つ)メソッドを用意して、インスタンスを作成します。
サンプル
関数A,B,Cは戻り値、引数が同じ型です。
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace strudy_deligate { //delegate void TestDelegate(int a); public partial class Form1 : Form { delegate void TestDelegate(int a);//引数intで戻り値無しのメソッドを参照するdelegate型を宣言 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { TestDelegate aDelegate = new TestDelegate(A); TestDelegate bDelegate = A;//上記を暗黙に型変換 int i = 10; 呼び先クラス 呼び先クラス = new 呼び先クラス(i); i = i + 10; TestDelegate[] TestDelegate1 = { A, B, 呼び先クラス.C }; //暗黙にTestDelegate型に変換 foreach (TestDelegate t in TestDelegate1) { t(i); i = i + 10; } //特に+=演算子を用いる事をマルチキャストデリゲートと言う TestDelegate multiDelegate = new TestDelegate(A); multiDelegate += new TestDelegate(B); multiDelegate += new TestDelegate(呼び先クラス.C); multiDelegate(i);//A,B,C関数の引数が全て同じ i = i + 10; //暗黙に型変換した場合のマルチキャストデリゲート TestDelegate 暗黙 = A; 暗黙 += B; 暗黙 += 呼び先クラス.C; 暗黙(i);//A,B,C関数の引数が全て同じ } static void A(int n)//引数intで戻り値無しのメソッド { MessageBox.Show("Aが呼ばれました" + n.ToString()); } private void B(int n)//引数intで戻り値無しのメソッド { MessageBox.Show("Bが呼ばれました" + n.ToString()); } } public class 呼び先クラス { public 呼び先クラス(int n) { MessageBox.Show("呼び先クラスコンストラクタ" + n.ToString()); } public void C(int n)//引数intで戻り値無しのメソッド { MessageBox.Show("Cが呼ばれました" + n.ToString()); } } } |
上記が簡単な使い方とマルチキャストデリゲートの基本です。これにより関数名を動的に呼び出す事ができます。