Compartilhar via


Membros com um número variável de parâmetros

Arrays são usados para passar um número variável de parâmetros para um membro. Alguns idiomas, como, por exemplo, C#, fornecem uma palavra-chave decora uma matriz que é usada para passar argumentos de variáveis. Para idiomas que não oferecem uma palavra-chave, o ParamArrayAttribute atributo fornece essa funcionalidade. A palavra-chave e o atributo afetam o último parâmetro na assinatura de um membro. Esse parâmetro deve ser uma matriz de dimensão única.

O exemplo de código a seguir demonstra como definir e chamar um método que leva a um número variável de parâmetros. Observe que na DemonstrateVariableParameters método, os argumentos não são colocados em uma matriz antes de chamar UseVariableParameters.


Public Shared Sub UseVariableParameters(ParamArray list() as  Integer) 
     For  i as Integer = 0  to list.Length -1 
        Console.WriteLine(list(i))
     Next i 
     Console.WriteLine()
End Sub

Public Shared Sub DemonstrateVariableParameters()

    Manager.UseVariableParameters(1,2,3,4,5)
End Sub


public static void UseVariableParameters(params int[] list) 
{
     for ( int i = 0 ; i < list.Length ; i++ )
     {
        Console.WriteLine(list[i]);
     }
     Console.WriteLine();
}

public static void DemonstrateVariableParameters()
{
    Manager.UseVariableParameters(1,2,3,4,5);
}

static void UseVariableParameters(... array<int>^ list)
{
    for ( int i = 0 ; i < list->Length ; i++ )
    {
        Console::WriteLine(list[i]);
    }
    Console::WriteLine();
}

static void DemonstrateVariableParameters()
{
    Manager::UseVariableParameters(1,2,3,4,5);
}

As diretrizes a seguir podem ajudá-lo a entender quando é vantajoso usar matrizes de variáveis de parâmetros e apropriados.

Considere adicionar a palavra-chave params parâmetros de matriz se você espera que os usuários finais para passar um pequeno número de elementos.

Se o desenvolvedor passará muitos elementos nos cenários comuns, o params palavra-chave é provavelmente menos útil porque é improvável que o desenvolvedor passará o grande número de objetos in-line.

Não use params arrays se o chamador quase sempre já teria a entrada em uma matriz.

Por exemplo, dados de byte é normalmente armazenados e manipulados em matrizes de bytes. Adicionando o params palavra-chave para um parâmetro de matriz de bytes não aborda um cenário comum porque os desenvolvedores normalmente não funcionam com bytes individuais que ainda não são armazenados em uma matriz de bytes.

Não use params arrays se a matriz é modificada pelo membro levando o parâmetro de matriz params.

O common language runtime (CLR) pode ter criado um objeto de matriz temporária. Se o método modifica uma matriz temporária, as modificações não estão disponíveis para o chamador.

Considere o uso a palavra-chave params em uma sobrecarga de simple, mesmo se uma sobrecarga mais complexa não é possível usá-lo.

É possível que os desenvolvedores serão beneficiada com a params matriz em uma sobrecarga, mesmo se ele estiver não em todas as sobrecargas.

Tente os parâmetros de ordem para que seja possível usar a palavra-chave params.

Isso significa que, quando possível, um parâmetro de matriz deve ser o último parâmetro especificado. O exemplo de código a seguir demonstra uma ordenação de parâmetro incorreto.

Overloads Public Function Add (i as Integer,j as Integer, numberBase as Int16) _
    as Integer
public int Add (int i,int j, short numberBase) 
int Add (int i,int j, short numberBase)
Overloads Public Function Add (i as Integer, j as Integer, k as Integer, _
    numberBase as int16) as Integer
public int Add (int i, int j, int k, short numberBase) 
int Add (int i, int j, int k, short numberBase)
' Can't use params array.
Overloads Public Function Add (numbers() as Integer, numberBase as Int16) _
    as Integer
// Can't use params array.
public int Add (int [] numbers, short numberBase) 
// Can't use params array.
int Add (array<int>^ numbers, short numberBase)

Os parâmetros devem ser reordenados da seguinte maneira:

Overloads Public Function Add (numberBase as Int16, i as Integer,j as Integer) _
    as Integer
public int Add (short numberBase, int i,int j)
int Add (short numberBase, int i,int j)
Overloads Public Function Add (numberBase as Int16, i as Integer, _
    j as Integer, k as Integer) as Integer
public int Add (short numberBase, int i, int j, int k) 
int Add (short numberBase, int i, int j, int k)
' Can use params array.
Overloads Public Function Add (numberBase as Int16, _
    ParamArray numbers() as Integer) as Integer
// Can use params array.
public int Add (short numberBase, params int [] numbers) 
// Can use params array.
int Add (short numberBase, ... array<int>^ numbers)

Considere fornecer sobrecargas especiais e os caminhos de código para chamadas com um pequeno número de argumentos em APIs de extremamente sensíveis ao desempenho.

Seguindo essa diretriz, você pode evitar a criação de matrizes quando um membro é chamado com um pequeno número de argumentos. Os nomes de parâmetro devem ser uma forma singular do parâmetro de matriz seguido de um sufixo numérico. O exemplo de código a seguir mostra uma assinatura do membro que segue essa diretriz.

Public Shared Sub WriteLine( _
     format as String,  _
     arg0 as Object, _
     arg1 as Object, _
     arg2 as Object _
)
public static void WriteLine(
    string format, 
    object arg0, 
    object arg1, 
    object arg2
)
static void WriteLine(
    String^ format,
    Object^ arg0,
    Object^ arg1,
    Object^ arg2
)

Esteja ciente de que null (Nothing no Visual Basic) pode ser passado como um argumento de matriz params.

O membro deve verificar se há um null array antes de processar o proprietário.

Não use os métodos varargs, também conhecidos como nas reticências.

Porque o varargs convenção de chamada é não compatível com CLS, não deve ser usado em membros públicos. Ele pode ser usado internamente.

Portions Copyright 2005 Microsoft Corporation. Todos os direitos reservados.

Portions Copyright Addison-Wesley Corporation. Todos os direitos reservados.

Para obter mais informações sobre as diretrizes de design, consulte a "diretrizes de Design do Framework: Convenções, idiomas e padrões de reutilizável.Bibliotecas de rede" catálogo por Krzysztof Cwalina e Brad Abrams, publicado pela Addison-Wesley, 2005.

Consulte também

Conceitos

Design de parâmetro

Outros recursos

Diretrizes de Design do membro

Diretrizes de Design para desenvolvimento bibliotecas de classe