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
該当する機能がないため割愛。