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