Compartilhar via


Considerações sobre procedimentos de sobrecarga (Visual Basic)

Quando você sobrecarrega um procedimento, você deve usar uma assinatura diferente para cada versão sobrecarregada. Isso geralmente significa que cada versão deve especificar uma lista diferente de parâmetros. Para obter mais informações, consulte "Assinatura Diferente" em Sobrecarga de procedimento (Visual Basic).

Você pode sobrecarregar um procedimento Function com um procedimento Sub e vice-versa, que tenham assinaturas diferentes. Duas sobrecargas não podem diferir somente no fato de que uma tem valor de retorno e a outra não.

Você pode sobrecarregar uma propriedade da mesma maneira que sobrecarrega um procedimento e com as mesmas restrições. No entanto, você não pode sobrecarregar um procedimento com uma propriedade, ou vice-versa.

Alternativas para Versões Sobrecarregadas

Às vezes, você tem alternativas para versões sobrecarregadas, particularmente quando a presença dos argumentos é opcional ou seu número é variável.

Tenha em mente que argumentos opcionais não são necessariamente suportados por todos os idiomas, e matrizes de parâmetros são limitadas a Visual Basic. Se você estiver escrevendo um procedimento que é provável de ser chamado a partir do código escrito em qualquer um dos vários idiomas diferentes, versões sobrecarregadas oferecem a maior flexibilidade.

Sobrecargas e Argumentos Opcionais

Quando o código de chamada pode opcionalmente fornecer ou omitir um ou mais argumentos, você pode definir várias versões sobrecarregados ou usar parâmetros opcionais.

Quando Usar Versões Sobrecarregadas

Você pode considerar definir uma série de versões sobrecarregadas nos casos a seguir:

  • A lógica no código do procedimento é significativamente diferente dependendo se o código de chamada fornece um argumento opcional ou não.

  • O código do procedimento não pode testar com confiança se o código que chama forneceu um argumento opcional. Este é o caso, por exemplo, se não houver nenhum candidato possível para um valor padrão que o código de chamada não se pôde esperar que fornecesse.

Quando Usar Parâmetros Opcionais

Você pode preferir um ou mais parâmetros opcionais nos seguintes casos:

  • A única ação necessária quando o código de chamada não fornece um argumento opcional é definir o parâmetro a um valor padrão. Em tais casos, o código do procedimento pode ser menos complicado se você definir uma única versão com um ou mais parâmetros Optional.

Para mais informações, consulte Parâmetros opcionais (Visual Basic).

Sobrecargas e ParamArrays

Quando o código de chamada puder passar um número variável de argumentos, você pode definir várias versões sobrecarregados ou usar um matriz de parâmetros.

Quando Usar Versões Sobrecarregadas

Você pode considerar definir uma série de versões sobrecarregadas nos casos a seguir:

  • Você sabe que o código de chamada nunca passa mais do que um pequeno número de valores para o matriz de parâmetros.

  • A lógica no código do procedimento é significativamente diferente dependendo de quantos valores o código de chamada passa.

  • O código de chamada pode passar valores de diferentes tipos de dados.

Quando Usar uma Matriz de Parâmetro

As melhores opções para um parâmetro ParamArray estão nos seguintes casos:

  • Você não é capaz de prever quantos valores o código de chamada pode passar para o matriz de parâmetros, e ele pode ser um número grande.

  • A lógica do procedimento presta-se a ir iterando por todos os valores que o código de chamada passa, executando essencialmente as mesmas operações em cada valor.

Para mais informações, consulte Matrizes de parâmetros (Visual Basic).

Sobrecargas Implícitas para Parâmetros Opcionais

Um procedimento com um parâmetro Opcional (Visual Basic) é equivalente a dois procedimentos sobrecarregados, um com o parâmetro opcional e outro sem ele. Você não pode sobrecarregar tal procedimento com uma lista de parâmetros correspondente a um desses. As seguintes declarações ilustram isto.

Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads. 
' Overloads Sub q(ByVal b As Byte) 
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use. 
' Overloads Sub q(ByVal c As Byte, ByVal k As Long) 
' The following overload uses a different signature and is valid. 
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)

Para obter um procedimento com mais de um parâmetro opcional, há um conjunto de sobrecargas implícitas, encontras por lógica semelhante ao exemplo anterior.

Sobrecargas Implícitas para um Parâmetro Paramarray

O compilador considera um procedimento com um parâmetro ParamArray (Visual Basic) para ter um número infinito de sobrecargas, com diferenças no que o código de chamada passa para o matriz de parâmetros, da seguinte maneira:

  • Uma sobrecarga para quando o código de chamada não fornece um argumento para o ParamArray

  • Uma sobrecarga para quando o código de chamada fornece um matriz unidimensional do tipo de elemento ParamArray

  • Para cada inteiro positivo, uma sobrecarga para quando o código de chamada fornece esse número de argumentos, cada um dos tipos de elemento ParamArray

As seguintes declarações ilustram essas sobrecargas implícitas.

Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads. 
' Overloads Sub p(ByVal d As Date) 
' Overloads Sub p(ByVal d As Date, ByVal c() As Char) 
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char) 
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char) 
' And so on, with an additional Char argument in each successive overload.

Você não pode sobrecarregar tal procedimento com uma lista de parâmetros que leva um matriz unidimensional para a matriz de parâmetros. No entanto, você pode usar as assinaturas das outras sobrecargas implícitas. As seguintes declarações ilustram isto.

' The following overload is not valid because it takes an array for the parameter array. 
' Overloads Sub p(ByVal x As Date, ByVal y() As Char) 
' The following overload takes a single value for the parameter array and is valid. 
Overloads Sub p(ByVal z As Date, ByVal w As Char)

Programação Sem Tipo Como uma Alternativa para Sobrecarga

Se você deseja permitir que o código de chamada passe diferentes tipos de dados para um parâmetro, uma abordagem alternativa é programação sem especificação de tipo. Você pode configurar a verificação de tipo para alternar para Off com o Instrução Option Strict ou para a opção do compilador /optionstrict. Então, você não precisará declarar o tipo de dados do parâmetro.. No entanto, esta abordagem tem as seguintes desvantagens comparadas à sobrecarga:

  • Programação sem tipo produz execução de código menos eficiente.

  • O procedimento deve testar cada tipo de dados que ele prevê que está sendo passado.

  • O compilador não pode sinalizar um erro se o código de chamada passa um tipo de dados que o procedimento não dá suporte.

Consulte também

Tarefas

Solucionando problemas de procedimentos (Visual Basic)

Como definir várias versões de um procedimento (Visual Basic)

Como chamar um procedimento sobrecarregado (Visual Basic)

Como sobrecarregar um procedimento que usa parâmetros opcionais (Visual Basic)

Como sobrecarregar um procedimento que use um número indefinido de parâmetros (Visual Basic)

Referência

Sobrecargas (Visual Basic)

Conceitos

Procedimentos no Visual Basic

Parâmetros e argumentos de procedimento (Visual Basic)

Resolução de sobrecarga (Visual Basic)