滅入るんるん

何か書きます

kotlin使いのためのC#入門 Functions

> Top

Function Declarations

Kotlinと違って、C#はメソッドのキーワードはありません。そのため、多種多様な構文を熟知しどれがメソッドであるかを把握する必要があります。と言っても、メソッドには引数を宣言する()があるので、()があるけどメソッドではないものを区別できるようになればいいでしょう。

class A
{
    void Method()
    {

    }

    // 一行で書く方法もある
    void OneLineMethod() => Method();
}

Functions Usage

Parameters

Kotlinと違いC#は型を前置します。

class A
{
    void Method(String a, String b)
    {

    }
}

Default Arguments

C#にもデフォルト引数があります。

class A
{
    void Method(String a, String b = null)
    {

    }
}

Named Arguments

C#もメソッド呼び出しの際に名前を付けて引数を指定することができます

class A
{
    void Method(String a, String b = null)
    {

    }

    void Call()
    {
        Method(a: "a", b: "b");
    }
}

Unit-returning functions

すでに何度も登場していますが、Kotlinで言うところのUnitはC#ではvoidです。 またC#ではメソッドの返り値の宣言を省略することはできません。

Single-Expression functions

既に説明済みなので割愛。

Explicit return types

上述の通りC#では返り値の宣言は省略することはできません。すべて宣言します。

Variable number of arguments (Varargs)

KotlinでのvarargキーワードはC#ではparamsキーワードとなっています。宣言時から配列として明示しているのでメソッド内で引数利用時に型がどうなるのか困る心配はありません。

class A
{
    void Method(params String[] args)
    {

    }

    void Call()
    {
        Method("1", "2", "3");
    }
}

また、params引数は最終引数である必要があります。

Infix notation

当する機能がないため割愛。

Function Scope

Local Functions

Kotlinとほとんど同じです。

class A
{
    void Main(String mainArgs)
    {
        int a = 0;

        void Sub(bool flag)
        {
            if (flag)
            {
                Console.WriteLine(a);
                Console.WriteLine(mainArgs);
            }
        }

        Sub(true);
    }
}

実はC#のローカルメソッドはコンパイル時に通常のメソッドに展開されます。デリゲートの場合はメソッドとなるクラスが疑似的に作成されてしまいますが、ローカルメソッドの場合、ただのメソッドとなるのでパフォーマンス上良いとも言われています。

Member Functions

説明するまでもないので割愛。

Generic Functions

C#では型パラメーターの宣言箇所が違うので注意が必要です。

class A
{
    T Main<T>(T arg)
    {
        return arg;
    }
}

Inline Functions

C#にはインライン化させることができません。 なぜかというと、C#では書かれたコードを機械的にCIL(共通中間言語)へと翻訳するだけで、最適化はそのあとのJIT頼みです。

そのため、インライン化するかどうかはメソッドの処理の量で変わったりします。

いちおう、インライン化してくれ~と頼むことはできますが実際にインライン化される保証はありません。

class A
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public void WantInline()
    {

    }
}

Extension Functions

こちらで説明済み。

Higher-Order Functions and Lambdas

次章で説明します。

Tail recursive functions

該当する機能がないため割愛。