佐々木屋

技術的なことから趣味まで色々書きます

オプション引数①

メソッドの引数を省略、既定値を設定できる機能をオプション引数と呼びます。

オプション引数はC++VB.NETでは昔からありましたが、C#では.NET Framework4.0から初めて導入されました。

オプション引数

C#は引数に既定値を設定するとオプション引数となります。

private void test(int a, int b, int c = 4) {
    Console.WriteLine(a + b + c);
}

test(1, 2, 3); //6
test(1, 2); //7



VB.NETではOptionalキーワードをつけます。

Private Sub test(ByVal a As Integer, ByVal b As Integer, Optional ByVal c As Integer = 4)
    Console.WriteLine(a + b + c)
End Sub

test(1, 2, 3) '6
test(1, 2) '7


オプション引数の制限

オプション引数は後ろの引数のみが有効です。上記の例であればaをオプションにしてbとcを通常、といったことは出来ません。以下のようにすると、「省略可能なパラメーターはすべての必須パラメーターの後で指定する必要があります」といったエラーが表示されます。

private void test(int a = 4, int b, int c) {
    Console.WriteLine(a + b + c);
}



C#のみ、可変長引数だけはオプション引数の後ろでも設定可能です。

private void test(int a, int b = 4, params int[] c) {
    Console.WriteLine(a + b + c.Length);
}

test(1, 2, 3, 4, 5, 6);


名前付き引数

引数の名前から指定することが可能です。よって、オプション引数を含んでいても、引数の順番は自由に書くことが出来ますし、省略も可能となります。

private void test(int a, int b, int c = 4) {
    Console.WriteLine(a + b + c);
}

test(c: 1,a: 2,b: 3);
Private Sub test(ByVal a As Integer, ByVal b As Integer, Optional ByVal c As Integer)
    Console.WriteLine(a + b + c)
End Sub

test(c:=1, a:=2, b:=3)



しかし、名前付きオプション引数は拡張・保守の観点から非常にリスキーなのでおすすめしません。