2010年4月1日木曜日

delegate-同期呼出

delegateは、メソッド情報(Methodプロパティー)を呼びメソッドの定義されるインスタンスの情報(Targetプロパティー)を持ち、それを同期または非同期に呼び出すことができる。

というわけで、まずは同期呼出から。とっても基本的な使い方。

  1. delegate void Hoge(string str);  
  2.   
  3. static void Main(string[] args)  
  4. {  
  5.     Hoge hoge = null;  
  6.   
  7.     hoge = Console.WriteLine;  
  8.   
  9.     hoge("AAA");  
  10.     hoge.Invoke("AAA");  
  11. }  

9行目と10行目はどちらも同じILがはき出され、この場合、Console.WriteLineが実行される。

delegateで宣言すると、MultiCastDelegateのサブクラスとなるので、常にInvocation Listを作ることが可能。

  1. static void Main(string[] args)  
  2. {  
  3.     Hoge hoge = null;  
  4.   
  5.     hoge = Console.WriteLine;  
  6.     hoge += delegate(string str)  
  7.     {  
  8.         Console.WriteLine(str.ToLower());  
  9.     };  
  10.   
  11.     hoge("AAA");  
  12. }  

メソッドはデリゲートに登録された順番に順次実行されていく。また、+=演算子はDelegate.Combineに置き換えられる。

メソッドの引数は同じオブジェクトが順番に渡されるため、1番目のメソッドで行われた変更を2番目のメソッドへと引き継ぐ。MultiCastDelegateの場合、最後のメソッドの戻り値以外は捨てられるので、引数のオブジェクトを通してしか情報の伝達ができない。

  1. class Program  
  2. {  
  3.     //戻値の型 デリゲートの型名 引数の型  
  4.     delegate void Hoge(Class c);  
  5.   
  6.     static void Main(string[] args)  
  7.     {  
  8.         Hoge hoge = null;  
  9.   
  10.         hoge += AAA;  
  11.         hoge += AAA;  
  12.         hoge += AAA;  
  13.         hoge += AAA;  
  14.   
  15.         hoge(new Class());  
  16.     }  
  17.   
  18.     static void AAA(Class c)  
  19.     {  
  20.         Console.WriteLine(c.MyProperty);  
  21.         ++c.MyProperty;  
  22.     }  
  23. }  
  24.   
  25.   
  26. class Class : Interface  
  27. {  
  28.     public int MyProperty { getset; }  
  29. }  

0 件のコメント: