通常、プロシージャ宣言で指定されているよりも多くの引数を持つプロシージャを呼び出すことはできません。 引数の数が不定である必要がある場合は、 パラメーター配列を宣言できます。これにより、プロシージャはパラメーターの値の配列を受け取ることができます。 プロシージャを定義するときに、パラメーター配列内の要素の数を把握する必要はありません。 配列のサイズは、プロシージャの呼び出しごとに個別に決定されます。
ParamArray の宣言
パラメーター リスト内のパラメーター配列を示すには 、ParamArray キーワードを使用します。 次の規則が適用されます。
プロシージャで定義できるパラメーター配列は 1 つだけであり、プロシージャ定義の最後のパラメーターである必要があります。
パラメーター配列は値渡しする必要があります。 プロシージャ定義に ByVal キーワードを明示的に含めるのは、プログラミング上の良い方法です。
パラメーター配列は自動的に省略可能です。 既定値は、パラメーター配列の要素型の空の 1 次元配列です。
パラメーター配列の前にあるすべてのパラメーターが必要です。 パラメーター配列は、唯一の省略可能なパラメーターである必要があります。
ParamArray の呼び出し
パラメーター配列を定義するプロシージャを呼び出すときは、次のいずれかの方法で引数を指定できます。
何もありません。つまり、 ParamArray 引数を省略できます。 この場合、空の配列がプロシージャに渡されます。 Nothing キーワードを明示的に渡すと、null 配列がプロシージャに渡され、呼び出されたプロシージャがこの条件をチェックしない場合、NullReferenceException が発生する可能性があります。
コンマで区切られた任意の数の引数のリスト。 各引数のデータ型は、
ParamArray
要素型に暗黙的に変換できる必要があります。パラメーター配列の要素型と同じ要素型を持つ配列。
いずれの場合も、プロシージャ内のコードは、パラメーター配列を、 ParamArray
データ型と同じデータ型の要素を持つ 1 次元配列として扱います。
Von Bedeutung
無期限に大きくなる可能性がある配列を処理するたびに、アプリケーションの内部容量がオーバーランするリスクがあります。 パラメーター配列を受け入れる場合は、呼び出し元のコードが渡した配列のサイズをテストする必要があります。 アプリケーションに対して大きすぎる場合は、適切な手順を実行します。 詳細については、「配列」を参照してください。
例
次の例では、関数 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)
こちらも参照ください
.NET