2010年4月1日木曜日

delegate-同期呼出

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 件のコメント: