滅入るんるん

何か書きます

Kotlin使いのためのC#入門 Lambdas

> Top

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

該当する機能がなかったり、説明が不要なものだったりするので割愛。