C# のラムダ式
C# のラムダ式とは?
ラムダ式 (lambda expression) は無名のメソッドを簡単に記述する方法です。
ラムダ式は次の形式になります。
(パラメータリスト) => 式 または ステートメントブロック
例えば、パラメータ x と y を取り、足して返すラムダ式は次のように書けます。
(x, y) => x + y;
ラムダ式はデリゲートとして作成されます。 このため .NET のビルトインのジェネリックデリゲートの Action や Func として作成できます。
Action や Func などの .NET ビルトインのジェネリックデリゲートについては「C# のジェネリックデリゲート」をご覧ください。
C# のラムダ式の簡単な例
次の例では int 型の x と y を受け取り、それらを足して int 型の値の結果を返すラムダ式を作成し利用しています。
using System;
using static System.Console;
class Program
{
static void Main(string[] args)
{
Func<int, int, int> a = (x, y) => x + y;
WriteLine(a(3, 5)); // 8
}
}
ラムダ式のパラメータリストの型指定は省略可能ですが、記載することもできます。また、return を明示的に書くこともできます。
using System;
using static System.Console;
class Program
{
static void Main(string[] args)
{
Func<int, int, int> a = (int x, int y) =>
{
return x + y;
};
WriteLine(a(3, 5)); // 8
}
}
上記のラムダ式は次の匿名メソッドと同じです。
Func<int, int, int> a = delegate (int x, int y)
{
return x + y;
};
ラムダ式が複数の文からなる (ステートメントブロックとなる) 場合は,次のように { } で本体を書きます。
Func<int, int, int> a = (x, y) =>
{
WriteLine("a called");
return x + y;
};
ラムダ式では必ずしも戻り値を必要とはしません。
using System;
using static System.Console;
class Program
{
static void Main(string[] args)
{
Action<int, int> a = (x, y) =>
{
WriteLine($"{x}+{y}={x + y}");
};
a(3, 5); // 3+5=8
}
}
C# のラムダ式とローカル変数
ローカル変数を用いてラムダ式を作成した場合、ローカル変数の値が変わればラムダ式が返す値も変わります。
using System;
using static System.Console;
class Program
{
static void Main(string[] args)
{
double r = 1.0;
Func<double> area = () => Math.PI * r * r;
WriteLine($"{area():F3}"); // 3.14
r = 2.0;
WriteLine($"{area():F3}"); // 12.566
}
}