配列型の引数とは別に、params
キーワード(C#)・ParamArray
キーワード(VB)を使うことにより、引数を可変長とすることができます。 可変長の引数では、引数に渡す値は必ずしも配列にする必要はありません(配列を直接渡すこともできます)。 メソッド側では、可変長引数は通常の配列と同様に扱うことができます。
可変長引数を使って任意個の値を渡す
Imports System
Class Sample
' 引数で与えられた配列の合計を求めるメソッド
Shared Function Sum(ByVal ParamArray arr() As Integer) As Long
Dim sum As Long = 0L
For Each val As Integer In arr
sum += val
Next
Return sum
End Function
Shared Sub Main()
Console.WriteLine("合計 = {0}", Sum(2, 5, 3))
Console.WriteLine("合計 = {0}", Sum(2, 5, 3, 8, 4))
Console.WriteLine("合計 = {0}", Sum(New Integer() {2, 5, 3, 8, 4})) ' 配列を渡すこともできる
End Sub
End Class
可変長引数は、必ずメソッドの一番最後の引数でなければなりません。 例えば、可変長引数のあとに通常の引数をとるようなメソッドを作成することはできません。
可変長引数を定義できる位置
// このように通常の引数のあとに可変長引数をとるようなメソッドは宣言できる
void ParamsMethodOK(int firstValue, params int[] values) {}
// このように可変長引数のあとに通常の引数をとるようなメソッドは宣言できない
void ParamsMethodNG(params int[] values, int lastValue) {}
可変長引数を定義できる位置
' このように通常の引数のあとに可変長引数をとるようなメソッドは宣言できる
Sub ParamsMethodOK(ByVal firstValue As Integer, ByVal ParamArray values() As Integer)
End Sub
' このように可変長引数のあとに通常の引数をとるようなメソッドは宣言できない
Sub ParamsMethodNG(ByVal ParamArray values() As Integer, ByVal lastValue As Integer)
End Sub
可変長引数の型をobjectにすることにより、任意の型の値を任意個とることができるようになります。 例えば、Console.WriteLineメソッドやString.Joinメソッドではobject型の可変長引数をとることができるようになっています。