Matrizes de parâmetros (Visual Basic)

Normalmente, você não pode chamar um procedimento com mais argumentos do que a declaração de procedimento especifica. Quando você precisa de um número indefinido de argumentos, pode declarar uma matriz de parâmetros, o que permite que um procedimento aceite uma matriz de valores para um parâmetro. Você não precisa saber o número de elementos na matriz de parâmetros ao definir o procedimento. O tamanho da matriz é determinado individualmente por cada chamada ao procedimento.

Declarar um ParamArray

Use a palavra-chave ParamArray para indicar uma matriz de parâmetros na lista de parâmetros. As seguintes regras se aplicam:

  • Um procedimento pode definir apenas uma matriz de parâmetros, e deve ser o último parâmetro na definição do procedimento.

  • As matrizes de parâmetros precisam ser passadas por valor. É uma boa prática de programação incluir explicitamente a palavra-chave ByVal na definição do procedimento.

  • A matriz de parâmetros é automaticamente opcional. Seu valor padrão é uma matriz unidimensional vazia do tipo de elemento da matriz de parâmetros.

  • Todos os parâmetros que precedem a matriz de parâmetros devem ser obrigatórios. A matriz de parâmetros deve ser o único parâmetro opcional.

Chamar um ParamArray

Ao chamar um procedimento que define uma matriz de parâmetros, você pode fornecer o argumento de qualquer uma das seguintes maneiras:

  • Nada — ou seja, você pode omitir o argumento ParamArray. Nesse caso, uma matriz vazia é passada para o procedimento. Se você passar explicitamente a palavra-chave Nothing, uma matriz nula será passada para o procedimento e poderá resultar em um NullReferenceException se o procedimento chamado não verificar essa condição.

  • Uma lista de um número arbitrário de argumentos separados por vírgulas. O tipo de dados de cada argumento deve ser implicitamente conversível para o tipo de elemento ParamArray.

  • Uma matriz com o mesmo tipo de elemento que o tipo de elemento da matriz de parâmetros.

Em todos os casos, o código dentro do procedimento trata a matriz de parâmetros como uma matriz unidimensional com elementos do mesmo tipo de dados que o tipo de dados ParamArray.

Importante

Sempre que você lida com uma matriz que pode ser indefinidamente grande, há o risco de ultrapassar alguma capacidade interna do aplicativo. Se você aceitar uma matriz de parâmetros, deverá testar o tamanho da matriz que o código de chamada passou para ela. Execute as etapas apropriadas se for muito grande para seu aplicativo. Saiba mais em Matrizes.

Exemplo

O exemplo a seguir define e chama a função calcSum. O modificador ParamArray do parâmetro args permite que a função aceite um número variável 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

O exemplo a seguir define um procedimento com uma matriz de parâmetros e gera os valores de todos os elementos de matriz passados para a 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)

Confira também