はじめに
UniRx,UniTaskの勉強を進めるうちに、前提知識として必要だったので調べてみました。筆者の感想を多く含みますので、誤りを含む可能性があります。参考元、公式の記述を参考にしてください。
ラムダ式
ほとんど参考記事で学びましたが、キーワードとしては「関数の記述の簡易化」のイメージでした。
記述量がどんどん減っていくことを見ていけば、利便性はわかってくると思います。
例として2数の平均値が欲しいとき、下記のように書けます。
//A:通常の記述
private int Average(int x, int y)
{
return (x + y)/2;
}
//B:ラムダ式による記述
(int x,int y)=>( x + y )/2;
//C:より簡略化した記述
(x,y)=> (x+y)/2
とても簡単に書けました。Cについては、型推論で計算結果、引数を分析してくれているのでintが省略できているようです。
int ave=(x+y)/2 のように一度変数に入れればよいのでは?というところもありますが、よく見る場面として変数動詞の計算というよりかは、ライブラリの返り値を簡単にいじって別のメソッドの引数にすぐ入れるというような使い方でしょうか。
また、引数なしの関数も作れるようです。とりあえず特定の関数を呼ぶだけということもできそうです。
//D:コンソールにHello Worldを出力する
() => Console.WriteLine("Hello World");
デリゲート
先ほどのラムダ式について、簡単に作った関数が使われるのは1度切り、ということはあまりないかと思います。そこで関数を呼び出せるように、「関数を入れる変数」として使われるのがデリゲートのようです。変数としてふるまうことができるので、デリゲート内の関数の差し替えもできます。
private void SayHello()
{
Console.WriteLine("Hello!");
}
public void Start()
{
// Action型のデリゲートに、SayHello関数を登録
Action action = SayHello;
// デリゲート実行→SayHelloが呼び出される
action();
// Invoke()で起動してもよい Invoke=呼び出す
action.Invoke();
}
デリゲートで受け取る変数にはいくつか型があり、返り値のありなしで型名が変わります。
Action型:引数なし、返り値なし
Action<>:引数あり、返り値なし <>内に引数の型
Func<>:引数なし、返り値あり <>内に返り値の型
Func<>:引数あり、返り値あり <>内に引数の型、返り値の型
LINQ
C#他でも使える、配列、List、Dictionary型に対する技術、ライブラリのようです。使用するにはusing System.Linq;でライブラリを呼び出しておきます。
書き方はドットで連ねるメソッド式と、SQLのように記述するクエリ式の2種類があるようです。
// クエリ構文
var query = from x in list
where x % 2 == 0
orderby x
select x * 3;
// メソッド構文
var query = list
.Where(x => x % 2 == 0)
.OrderBy(x => x)
.Select(x => x * 3);
上記の文では、型推論によるvarで受け取っていますが、LINQではIEnumerable<>で返り値を受け取ります。
ラムダ式でListに対する選択の条件式を作り、デリゲートに引数あり、返り値ありとして暗に代入して、LINQメソッドが引数としてデリゲートを受け取るというような合わせ技でしょうか。Listに対するLINQメソッドについては参考記事をご確認ください。1
おわりに
よく見ると配列操作のときにLINQの呼び出しをしたような気もして、少し理解が深まったとおもいます。引き続き学習を進めたいと思います。ちなみにこの本を読もうとしていた時にLINQ、ラムダ式が前提と言われていました。
参考記事