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