Matrices de parámetros (Visual Basic)
Normalmente no se puede llamar a un procedimiento con más argumentos de los que especifica la declaración del procedimiento. Si necesita un número indefinido de argumentos, puede declarar una matriz de parámetros, lo que permite que un procedimiento acepte una matriz de valores para un parámetro. No es necesario conocer el número de elementos de la matriz de parámetros al definir el procedimiento. Cada llamada al procedimiento determina individualmente el tamaño de la matriz.
Declaración de ParamArray
Use la palabra clave ParamArray para indicar una matriz de parámetros de la lista de parámetros. Se aplican las reglas siguientes:
Un procedimiento solo puede definir una matriz de parámetros, y debe ser el último parámetro de la definición del procedimiento.
La matriz de parámetros debe pasarse por valor. Es un buen procedimiento de programación incluir explícitamente la palabra clave ByVal en la definición del procedimiento.
La matriz de parámetros es opcional automáticamente. Su valor predeterminado es una matriz unidimensional vacía del tipo de elemento de la matriz de parámetros.
Todos los parámetros anteriores a la matriz de parámetros deben ser requeridos. La matriz de parámetros debe ser el único parámetro opcional.
Llamada a ParamArray
Al llamar a un procedimiento que define una matriz de parámetros, puede proporcionar el argumento de cualquiera de las maneras siguientes:
Nothing: es decir, puede omitir el argumento ParamArray. En este caso, se pasa una matriz vacía al procedimiento. Si pasa explícitamente la palabra clave Nothing, se pasa una matriz null al procedimiento y puede dar lugar a una excepción NullReferenceException si el procedimiento llamado no comprueba esta condición.
Una lista de un número arbitrario de argumentos separados por comas. El tipo de datos de cada argumento debe poder convertirse implícitamente en el tipo de elemento
ParamArray
.Una matriz con el mismo tipo de elemento que el tipo de elemento de la matriz de parámetros.
En todos los casos, el código del procedimiento trata la matriz de parámetros como una matriz unidimensional con elementos del mismo tipo de datos que el tipo de datos ParamArray
.
Importante
Siempre que se trata con una matriz que puede ser indefinidamente grande, existe el riesgo de invalidar alguna capacidad interna de la aplicación. Si acepta una matriz de parámetros, debe comprobar el tamaño de la matriz que el código de llamada le ha pasado. Realice los pasos adecuados si es demasiado grande para la aplicación. Para más información, consulte Matrices.
Ejemplo
En el ejemplo siguiente se define la función calcSum
y se la llama. El modificador ParamArray
del parámetro args
permite que la función acepte un número variable de argumentos.
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
En el ejemplo siguiente se define un procedimiento con una matriz de parámetros y se generan los valores de todos los elementos de matriz pasados a la matriz de parámetros.
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)