C#ではKotlinと同じくメソッドやラムダもfirst-classです。また、それらは高階関数とかなんとか云々です。 まぁ、Kotlinと同じような感じのオブジェクト扱いだと思ってください。 (私がそのあたりの用語に興味がなく、無知だから説明省いてるだけ)
Higher-Order Functions
kotlinlangでの高階関数は何が言いたいのかよくわかりませんが、C#でも表記が変わりますが同じことができます。
public static class EnumerableExtension { public static void ForEach<T>(this IEnumerable<T> source,Action<T> action) { foreach(T value in source) { action(value); } } }
Function types
C#ではあらかじめ関数の型となるデリゲートがいくつか宣言されています。 メソッドの引数などではそれらのデリゲートの型を使えばいいです。
型 | 返り値 |
---|---|
Action | なし |
Func | あり |
表のような覚え方をしてください。
たとえば、引数が2つあり返り値なしのラムダならAction<TArg1,TArg2>
のようになり、返り値ありならFunc<TArg1,Targ2,TResult>
のようになります。
他にも標準で宣言済みのデリゲートは多々ありますが、基本的にこの2つさえ押さえれば問題ないです。
また、Kotlinでのレシーバー付きのラムダはC#には存在しませんので代替の表現方法を検討してください。
Instantiating a function type
public class Lambda { public void Method() { var array = new int[3]; array.ForEach(x => Console.WriteLine(x)); array.ForEach(this.Log); } private void Log(int i) { Console.WriteLine(i); } }
C#ではラムダの宣言は引数 => ブロック
のようになっています。複数行の場合は引数 => {}
のようになります。
また、メソッドをデリゲートとして扱うには、フィールドアクセスのように参照するだけです。()
でのメソッド呼び出しをしなければ、デリゲートの取得となるわけです。
invoking a function type instance
public class Lambda { public void Method() { Action<int> log = this.Log; log(1); log.Invoke(2); } private void Log(int i) { Console.WriteLine(i); } }
例で分かると思うので説明略。
Inline functions
該当する機能がないため割愛。
Lambda Expressions and Anonymous Functions
該当する機能がなかったり、説明が不要なものだったりするので割愛。