足し算、引き算を引数にできるか? §
値ではなく計算方法を引数にできるでしょうか?
つまり、123や45を引数にするのではなく、足し算や引き算を引数にできるでしょうか?
できます。
それにはラムダ式という機能を使うと便利です。
ラムダ式は、名前のないメソッドのようなもので、変数に代入したり、引数で渡したりすることができます。
サンプルソースの(x, y) => x + yなどがラムダ式です。
これには数式だけでなく、波括弧で囲って複雑なコードも書くことができます。
ラムダ式を入れることができる変数や引数の型は、デリゲート型ですが、通常はAction型またはFunc型を使います。戻り値がないときはAction型、あるときはFunc型です。ですから、整数を2つ受け取って整数を返す型はFunc<int,int,int>と型引数に3つのintが並びます。
罠の数々 §
- Action型、Func型の変数/引数に代入できるのはラムダ式に限らない。引数や戻り値が一致すれば通常のメソッドも入る
- ラムダ式が使われる前には匿名メソッドというものがあって、希にそれが残ったままのソースがある。注意しよう
参考リンク §
Func<T1,T2,TResult> デリゲート
=> 演算子 (C# リファレンス)
ラムダ式 (C# リファレンス)
ラムダ式の書き方はいろいろある。知らない書き方でビックリしないように、様々なパターンを上記のリンクから把握しておこう。
リポジトリ §
https://github.com/autumn009/cshowto
Lambda §
using System;
class Program
{
private static void sub(string label, Func<int, int, int> calc)
{
Console.WriteLine($"123と45の{label}の結果は{calc(123, 45)}です。");
}
static void Main()
{
sub("足し算", (x, y) => x + y);
sub("引き算", (x, y) => x - y);
sub("特殊条件計算", (x, y) =>
{
for (int i = 0; i < y; i++)
{
x += (int)(Math.Sin((double)i / (double)y) * 100);
}
return x;
});
}
}
実行結果
123と45の足し算の結果は168です。
123と45の引き算の結果は78です。
123と45の特殊条件計算の結果は2124です。
(最後の一つは意味のない計算を行っています)