匿名関数とローカル関数 使用頻度が高い

基本文法

匿名関数

匿名メソッド式とラムダ式を合わせて匿名関数(Anonymous functions)という

匿名メソッド(anonymous method)

class Sammple
 {
     static void SampleMethod(string val)
     {
         Console.WriteLine(val);
     }
 
     static void Main(string[] args)
     {
         // C#1.0の頃は名前のあるメソッドを指定してました
         Action<string> action1 = SampleMethod;
 
         // C#2.0からはインラインで処理を定義できるので名前が不要となり匿名メソッド
         Action<string> action2 = delegate(string val) { Console.WriteLine(val); };
 
         // 引数リストは省略可能
         Action<int> action3 = delegate { Console.WriteLine("hoge"); };
      }
}

ラムダ式

C#3.0から使えます
デリゲート型または式ツリーを作成するために使用
これにより匿名メソッドを使うことはほぼ無くなりました

「引数 => 式」(「(input parameters) => expression」)の形式で表します  
// 引数 => 式(処理) 
Func<int, int, bool> func1 = (int x, int y) =>
{
    return (x == y);
};
 
// 引数の型は省略可能(コンパイラが型を推論可能の場合)
Func<int, int, bool> func2 = (x, y) =>
{
    return (x == y);
};
 
// 処理が短文の場合は中カッコとreturnも省略可能
Func<int, int, bool> func3 = (x, y) => x == y;
 
// 入力パラメタが1つの場合はカッコも省略可能
Func<int, bool> func4 = x => x > 0;
 
// 入力パラメタがない場合は空のカッコが必要
Action action = () => Console.WriteLine("Test");

ローカル関数

C#7.0から追加されました
メソッドの中にメソッドを定義できるようなもの

・再帰が簡単に書ける
・イテレータやジェネリックなどが使える
・静的ローカル関数(static)はC#8.0以降
・ラムダ式との使い分けがよくわからん
・一か所からしか呼ばれないプライベートメソッドなどはこれに代替できそう
// ローカル関数で階乗を求めるサンプル
public static int FunctionFactorial(int n)
{
    // 関数定義の前でも使える
    return Factorial(n);

    int Factorial(int number) => number < 2 ? 1 : number * Factorial(number - 1);

}