パラメーター配列 (Visual Basic)

通常、プロシージャ宣言で指定されている引数よりも多くの引数でプロシージャを呼び出すことはできません。 不特定数の引数が必要な場合は、"パラメーター配列" を宣言できます。これにより、プロシージャはパラメーターの値の配列を受け入れることができます。 プロシージャを定義するときに、パラメーター配列の要素の数がわかっている必要はありません。 配列のサイズは、プロシージャの呼び出しごとに個別に決定されます。

ParamArray の宣言

ParamArray キーワードを使用して、パラメーター リスト内のパラメーター配列を示します。 次の規則が適用されます。

  • プロシージャではパラメーター配列を 1 つだけ定義でき、プロシージャ定義の最後のパラメーターである必要があります。

  • パラメーター配列は値渡しにする必要があります。 プロシージャの定義に ByVal キーワードを明示的に含めることをお勧めします。

  • パラメーター配列は自動的に省略可能になります。 既定値は、パラメーター配列の要素型の空の 1 次元配列です。

  • パラメーター配列の前にあるすべてのパラメーターが必須である必要があります。 パラメーター配列が唯一の省略可能なパラメーターでなければなりません。

ParamArray の呼び出し

パラメーター配列が定義されているプロシージャを呼び出すときは、次のいずれかの方法で引数を指定できます。

  • Nothing - つまり、ParamArray 引数を省略できます。 この場合、プロシージャに空の配列が渡されます。 Nothing キーワードを明示的に渡すと、プロシージャに null 配列が渡されます。呼び出されたプロシージャがこの条件をチェックしない場合、NullReferenceException が発生する可能性があります。

  • コンマで区切られた任意の数の引数のリスト。 各引数のデータ型は、ParamArray 要素型に暗黙的に変換できる必要があります。

  • パラメーター配列の要素型と同じ要素型の配列。

どの場合も、プロシージャ内のコードは、パラメーター配列を、ParamArray のデータ型と同じデータ型の要素を含む 1 次元配列として扱います。

重要

無限に大きくなる可能性がある配列を処理する場合は常に、アプリケーションの何らかの内部容量が超過するリスクがあります。 パラメーター配列を受け入れる場合は、呼び出し元のコードから渡された配列のサイズをテストする必要があります。 アプリケーションにとって大きすぎる場合は、適切な手順を実行してください。 詳細については、「配列」を参照してください。

次の例では、calcSum 関数を定義して呼び出します。 args パラメーターの ParamArray 修飾子により、関数は可変数の引数を受け入れることができます。

Module Module1

    Sub Main()
        ' In the following function call, CalcSum's local variables
        ' are assigned the following values: args(0) = 4, args(1) = 3,
        ' and so on. The displayed sum is 10.
        Dim returnedValue As Double = CalcSum(4, 3, 2, 1)
        Console.WriteLine("Sum: " & returnedValue)
        ' Parameter args accepts zero or more arguments. The sum
        ' displayed by the following statements is 0.
        returnedValue = CalcSum()
        Console.WriteLine("Sum: " & returnedValue)
    End Sub

    Public Function CalcSum(ByVal ParamArray args() As Double) As Double
        CalcSum = 0
        If args.Length <= 0 Then Exit Function
        For i As Integer = 0 To UBound(args, 1)
            CalcSum += args(i)
        Next i
    End Function

End Module

次の例では、パラメーター配列を使用するプロシージャを定義し、パラメーター配列に渡されたすべての配列要素の値を出力します。

Sub studentScores(ByVal name As String, ByVal ParamArray scores() As String)
    Debug.WriteLine("Scores for " & name & ":" & vbCrLf)
    ' Use UBound to determine largest subscript of the array.
    For i As Integer = 0 To UBound(scores, 1)
        Debug.WriteLine("Score " & i & ": " & scores(i))
    Next i
End Sub
Call studentScores("Anne", "10", "26", "32", "15", "22", "24", "16")
Call studentScores("Mary", "High", "Low", "Average", "High")
Dim JohnScores() As String = {"35", "Absent", "21", "30"}
Call studentScores("John", JohnScores)

関連項目