En Visual Basic, se puede utilizar el parámetro ParamArray para pasar un número variable de argumentos a un procedimiento o función. Es una forma conveniente de crear métodos con un número no fijo de parámetros del mismo tipo.
Sub ShowNumbers(ParamArray numbers() As Integer) For Each n As Integer In numbers Console.WriteLine(n) Next End Sub ' Llamadas: ShowNumbers(1, 2, 3, 4) ShowNumbers() ' es posible llamar sin argumentos
ParamArray siempre se pasan como array y no pueden ser ByRef.ParamArray permite que un procedimiento acepte un número diferente de parámetros del mismo tipo, mientras que la sobrecarga crea varios métodos con diferentes firmas.
Ejemplo de sobrecarga:
Sub Add(a As Integer, b As Integer) ' ... End Sub Sub Add(a As Integer, b As Integer, c As Integer) ' ... End Sub
Cuándo usar:
ParamArray: cuando hay muchos parámetros de un mismo tipo.Pregunta: ¿Puede un procedimiento contener simultáneamente ParamArray y otros parámetros, qué limitaciones hay en su orden?
Respuesta: Sí, puede, pero ParamArray debe ser necesariamente el último parámetro y solo uno en la firma de la función.
Ejemplo de uso incorrecto:
Sub Test(ParamArray x() As Integer, y As String) ' Error de compilación End Sub
Opción correcta:
Sub Test(y As String, ParamArray x() As Integer) ' Correcto End Sub
Historia
Se construyó una función para recopilar datos de diferentes fuentes con ParamArray, pero en muchos casos se pasaron arrays manualmente. El desarrollador no notó que pasar un array conduce a un array anidado (array de arrays), como resultado, el procesamiento siempre fue incorrecto, dañando los datos de informes.
Historia
Para la creación universal de consultas SQL, se utilizó ParamArray de argumentos String, pero al actualizar el método se agregó un parámetro obligatorio después de ParamArray. Todo el sistema dejó de compilarse.
Historia
Para la sobrecarga de métodos con diferentes conjuntos de parámetros, se aplicaron tanto ParamArray como Overloading. Esto llevó a colisiones de ambigüedad: el compilador no siempre podía determinar qué variante del método invocar, ya que ParamArray encajaba en varias sobrecargas a la vez.