delegateは、メソッド情報(Methodプロパティー)を呼びメソッドの定義されるインスタンスの情報(Targetプロパティー)を持ち、それを同期または非同期に呼び出すことができる。
というわけで、まずは同期呼出から。とっても基本的な使い方。
- delegate void Hoge(string str);
- static void Main(string[] args)
- {
- Hoge hoge = null;
- hoge = Console.WriteLine;
- hoge("AAA");
- hoge.Invoke("AAA");
- }
9行目と10行目はどちらも同じILがはき出され、この場合、Console.WriteLineが実行される。
delegateで宣言すると、MultiCastDelegateのサブクラスとなるので、常にInvocation Listを作ることが可能。
- static void Main(string[] args)
- {
- Hoge hoge = null;
- hoge = Console.WriteLine;
- hoge += delegate(string str)
- {
- Console.WriteLine(str.ToLower());
- };
- hoge("AAA");
- }
メソッドはデリゲートに登録された順番に順次実行されていく。また、+=演算子はDelegate.Combineに置き換えられる。
メソッドの引数は同じオブジェクトが順番に渡されるため、1番目のメソッドで行われた変更を2番目のメソッドへと引き継ぐ。MultiCastDelegateの場合、最後のメソッドの戻り値以外は捨てられるので、引数のオブジェクトを通してしか情報の伝達ができない。
- class Program
- {
- //戻値の型 デリゲートの型名 引数の型
- delegate void Hoge(Class c);
- static void Main(string[] args)
- {
- Hoge hoge = null;
- hoge += AAA;
- hoge += AAA;
- hoge += AAA;
- hoge += AAA;
- hoge(new Class());
- }
- static void AAA(Class c)
- {
- Console.WriteLine(c.MyProperty);
- ++c.MyProperty;
- }
- }
- class Class : Interface
- {
- public int MyProperty { get; set; }
- }
0 件のコメント:
コメントを投稿