■ はじめに
Delegate について、学んでいく
補足:Delegate の英語的意味
(名) 代表者、使節 (動) 委任する、代表を立てる
■ デリゲート (delegate)
デリゲートを使うと、イベントを作成する(処理を渡す)ことが可能 * デリゲート : 委譲(=他のものに譲って任せること) (AクラスにBクラスのインスタンスを渡すことなく、AクラスがBクラスのメソッドを実行することができる) * C言語の関数ポインタのようなもの * 主にイベント・ハンドラやコールバック・メソッドとして活用
■ 利用手順
1)デリゲートを定義する 2)デリゲートしたいメソッド本体を記述 3)デリゲートの設定 4)メソッドの実行
1)デリゲートを定義する
サンプル
delegate string SampleDelegate(string value);
## 2)デリゲートしたいメソッド本体を記述 サンプル
//(別にこれは特別なことはない) protected string CaseTrue(string value) { return value + " From CaseTrue!!"; }
3)デリゲートの設定
手順1)で定義したデリゲートに、 手順2)で記述したメソッドを、 デリゲートのオブジェクトとして設定
サンプル
SampleDelegate obj = new SampleDelegate(this.CaseTrue);
4)メソッドの実行
手順3)で設定したオブジェクトからメソッドを実行
サンプル
string result = obj("Hello world!");
■ デリゲートの追加・削除
追加
* 「+演算子」か「+=演算子」を用いる
削除
* 「-=演算子」を用いる
サンプル
// [1] デリゲート定義 delegate void SampleDelegate(); #region [2] メソッド本体 public class ClassSample { public string str = string.Empty; public void method1() { str += " method1 "; } public void method2() { str += " method2 "; } public void method3() { str += " method3 "; } } #endregion private void button1_Click(object sender, EventArgs e) { ClassSample obj = new ClassSample(); // [3] デリゲートにメソッドを設定 SampleDelegate obj1 = new SampleDelegate(obj.method1); SampleDelegate obj2 = new SampleDelegate(obj.method2); SampleDelegate obj3 = new SampleDelegate(obj.method3); // [4] デリゲートの追加 obj1 += obj2; obj1 += obj3; // [5] メソッドを実行 obj1(); this.label1.Text = obj.str; }
■ サンプル
例1
// [1] デリゲートを定義する delegate void DelegateMethod(string name); // [2] デリゲートしたいメソッド本体を記述(別にこれは特別なことはない) public static void Method(string name) { Console.WriteLine(string.Format("Hello {0}!", name)); } private void button1_Click(object sender, EventArgs e) { DelegateMethod methodObject; // [3] 手順[1]で定義したデリゲートに、 // 手順[2]で記述したメソッドを、デリゲートのオブジェクトとして設定 methodObject = Method; // [4] 手順[3]で設定したオブジェクトからメソッドを実行 methodObject("Mike"); }
例2
デリゲートを呼び出すメソッド // [1] デリゲートを定義する delegate void SampleDelegateMethod(); private void button2_Click(object sender, EventArgs e) { Test.SampleDelegate obj = new Test.SampleDelegate(); // [3] 手順[1]で定義したデリゲートに、 // 手順[2]で記述したメソッドを、デリゲートのオブジェクトとして設定 SampleDelegateMethod deleObj = new SampleDelegateMethod(obj.Method); // [4] 手順[3]で設定したオブジェクトからメソッドを実行 deleObj(); // 出力「 Run Method 」 this.label1.Text = obj.str; } デリゲートしたいメソッド本体を記述したクラス(SampleDelegate.cs) namespace Test { public class SampleDelegate { public string str = string.Empty; // [2] デリゲートしたいメソッド本体を記述 public void Method() { str += " Run Method "; } } }
例3
・・・ // [1] デリゲート定義 delegate string SampleDelegate(string value); ・・・ #region [2] メソッド本体 protected string CaseTrue(string value) { return value + " From CaseTrue!!"; } protected string CaseFlase(string value) { return value + " From CaseFlase..."; } #endregion SampleDelegate obj; bool flag = false; if (flag) { obj = new SampleDelegate(this.CaseTrue); // [3] デリゲートにメソッドCaseTrue()を設定 } else { obj = new SampleDelegate(this.CaseFlase); // デリゲートにメソッドCaseFlase()を設定 } Console.Writeln(obj("Hello world!")); // "Hello world! From CaseFlase..."が表示される
参考資料
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_017/csharp_abc05.html
関連記事
Delegate / Event ~ 入門編 / Event ~
https://dk521123.hatenablog.com/entry/2010/12/25/221009