Compartir a través de


Miembros con un número variable de parámetros

Las matrices se utilizan para pasar un número variable de parámetros a un miembro. Algunos lenguajes, como C#, proporcionan una palabra clave que decora una matriz utilizada para pasar argumentos variables. Para lenguajes que no incluyen una palabra clave, el atributo ParamArrayAttribute proporciona esta funcionalidad. La palabra clave y el atributo afectan al último parámetro de la firma de un miembro. Ese parámetro debe ser una matriz unidimensional.

El ejemplo de código siguiente muestra cómo definir y llamar a un método que toma un número variable de parámetros. Observe que en el método DemonstrateVariableParameters, los argumentos no se colocan en una matriz antes de llamar a 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);
}

Las instrucciones siguientes pueden ayudarle a entender cuándo es adecuado y beneficioso utilizar matrices de variables para los parámetros.

Considere la posibilidad de agregar la palabra clave params a los parámetros de la matriz si espera que los usuarios finales pasen un número reducido de elementos.

Si el desarrollador va a pasar muchos elementos en escenarios comunes, la palabra clave params es quizás menos útil porque no es probable que vaya a pasar grandes cantidades de objetos en línea.

No utilice las matrices de parámetros si el llamador casi siempre tendrá ya la entrada en una matriz.

Por ejemplo, los datos de bytes se suelen almacenar y manipular en matrices de bytes. Agregar la palabra clave params a un parámetro de matriz de bytes no corresponde a un escenario común porque normalmente los desarrolladores no trabajan con bytes concretos que no están ya almacenados en una matriz de bytes.

No utilice matrices de parámetros si el miembro que toma el parámetro de la matriz de parámetros modifica la matriz.

Common Language Runtime (CLR) podría haber creado un objeto de matriz temporal. Si el método modifica una matriz temporal, las modificaciones no están disponibles para el llamador.

Considere utilizar la palabra clave params en una sobrecarga simple, aun cuando una sobrecarga más compleja no pueda utilizarla.

Es posible que los desarrolladores se beneficiarán de tener la matriz params en una sobrecarga, aun cuando no esté en todas las sobrecargas.

Intente ordenar los parámetros de forma que se pueda utilizar la palabra clave params.

Esto significa que, cuando posible, un parámetro de la matriz debería ser el último parámetro especificado. El ejemplo de código siguiente muestra un orden de parámetros incorrecto.

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)

Los parámetros se deberían reordenar como sigue:

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 la posibilidad de proporcionar sobrecargas especiales y rutas de acceso a código para las llamadas con un número pequeño de argumentos en API en los que el rendimiento es sumamente importante.

Siguiendo esta instrucción, puede evitar crear matrices cuando se llama a un miembro con un número pequeño de argumentos. Los nombres de parámetro deberían ser una forma singular del parámetro de la matriz seguido por un sufijo numérico. El ejemplo de código siguiente muestra una firma de miembro que sigue esta instrucción.

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
)

Observe que null (Nothing en Visual Basic) se podría pasar como un argumento de matriz de parámetros.

Su miembro debería comprobar si una matriz es null antes de procesarla.

No utilice los métodos varargs, también conocidos como puntos suspensivos.

Dado que la convención de llamada a varargs no es conforme a CLS, no se debería utilizar en miembros públicos. Se puede utilizar internamente.

Portions Copyright 2005 Microsoft Corporation. Reservados todos los derechos.

Portions Copyright Addison-Wesley Corporation. Reservados todos los derechos.

Para obtener más información sobre las directrices de diseño, consulte “las instrucciones de diseño de Framework: Convenciones, frases realizadas y modelos para libro de bibliotecas reutilizables de .NET” de Krzysztof Cwalina y Brad Abrams, publicados por Addison-Wesley, 2005.

Vea también

Conceptos

Diseño de parámetros

Otros recursos

Instrucciones de diseño de miembros

Instrucciones de diseño para desarrollar bibliotecas de clases