だらだらやるよ。

こげつのIT技術メモ

匿名メソッド

これは前からあったdelegate拡張機能みたいな感じ。
というわけで例によって使い方の違いはこんな感じです。

public delegate void DTest1(string message);
public void DTest11(string m){
	MessageBox.Show(m+"テスト1回目です");
}
public void DTest12(string m){
	MessageBox.Show(m+"テスト2回目です");
}
public void DTest13(string m){
	MessageBox.Show("テスト3回目です");
}
static void Main(){
	DTest1 d = new DTest1(DTest11);
	d += new DTest1(DTest12);
	d += new DTest1(DTest13);
	d("test");
}

で、C#2.0

public delegate void DTest2(string name);
public void DTest21(string name) {
	MessageBox.Show(name+"テスト2回目です");
}
static void Main(){
	DTest2 d = delegate(string name) { MessageBox.Show(name+"テスト1回目です"); };
	d += DTest21;
	d += delegate { MessageBox.Show("テスト3回目です"); };
	d("test");
}

拡張された点としては
・メソッド定義をしなくても使えるようになった。
・メソッド定義したときでも、使うときの記述が簡単になった。
・引数を使用しない場合は、省略可能になった。
ってとこでしょうか、あとは型の継承関係も自動的に解決してくれるとかそんな感じ。

上記のような書き方はどちらかというとイベント定義するときに使うかな、という感じですね
おいらはこんな感じで使ってますよー

delegate void DelegateMethod(string st);
private void Test1(List<string> list,DelegateMethod dm){
	foreach(string st in list){
		dm(st);
	}
}
static void Main(){
	List<string> list = new List<string>();
	list.Add("aa");
	list.Add("bb");
	list.Add("cc");
	Test1(list,delegate(string st) { Console.WriteLine("test1:" + st); });
	Test1(list,delegate(string st) { Console.WriteLine("test2:" + st); });
}


で、ジェネリックデリゲートなのですが、特別な機能というよりは、ジェネリックとデリゲートを組み合わせた使い方になります
.NETでは標準で以下のようなデリゲートが定義されているらしいです。
public delegate void Action(T obj);
ひとつの型を引数に持ち、戻り値が無いメソッドに対しては汎用的に使用できるため、色々できます。
例えば

void Test(string st){
	Console.WriteLine(st);
}
Action<string> a = Test;
a("てすと1");
a("てすと2");

また、当然っちゃ当然ですがこんな書き方もいけますよー

Action<string> a = Console.WriteLine;
a("てすと1");
a("てすと2");