C#のFuncについて

とりあえずテストコード

void Main()
{
	Func<string,Action,Action,bool> func = (testName,action1,action2) =>
            {
				action1();
                Console.WriteLine(testName);
				action2();
				return true;
            };
			
	func("FuncTestCode:1", () => {
		Console.WriteLine("FuncTestCode:2");
	}, () => {
		Console.WriteLine("FuncTestCode:3");
	});
}


出力結果

FuncTestCode:2
FuncTestCode:1
FuncTestCode:3

要はメソッド内の処理をデリゲート(委譲)するもの。
匿名メソッドって言うらしい?

匿名メソッド、ラムダ式については以下のサイトでわかりやすくまとめてある
http://csharp30matome.seesaa.net/article/129993518.html


例えば以下の匿名メソッド(WriteLine1)とメソッド(WriteLine2)は同じものである(と考えてよい)。

void Main()
{
	Func<string,bool> WriteLine1 = (text) =>
            {
                Console.WriteLine(text);
				return true;
            };
}

public bool WriteLine2(string text)
{
	Console.WriteLine(text);
	return true;
}


なので以下のような(意味のない)メソッドがあった場合

public bool ActionInvoke(Func<string,bool> action,string text)
{
	Console.WriteLine("【ActionInvoke】text:{0}",text);
	if(action(text))
		return true;
	else
		return false;
}

どちらもActionの引数として渡せるのである

void Main()
{
	Func<string,bool> WriteLine1 = (text) =>
            {
                Console.WriteLine(text);
				return true;
            };
			
	ActionInvoke(WriteLine1,"Test1");
	
	ActionInvoke(WriteLine2,"Test2");
}

public bool WriteLine2(string text)
{
	Console.WriteLine(text);
	return true;
}
// Define other methods and classes here
public bool ActionInvoke(Func<string,bool> action,string text)
{
	Console.WriteLine("【ActionInvoke】text:{0}",text);
	if(action(text))
		return true;
	else
		return false;
}

出力結果

【ActionInvoke】text:Test1
Test1
【ActionInvoke】text:Test2
Test2