2012-01-03 20 views
12

Recuerdo que tengo rojo en alguna parte que puede crear un método que toma argumentos interminables. El problema es que no recuerdo cómo hacerlo. Recuerdo que era algo como esto:Argumentos del método sin fin del mismo tipo

private void method(int arguments...) 
{ 
//method body 
} 

estoy seguro de que no había "...". Y recuerdo que cuando llamas al method puedes llamarlo así: method(3232); o method(123,23,12); Si alguien entiende de lo que estoy hablando dime cómo hacerlo.

Respuesta

42

lo haría con el params palabra clave:

private void method(params int[] arguments) 
{ 
    //method body 
} 

Se podría invocar su método de este modo: method(1,2,3,4,5,6,7,8,9); y la matriz contendría esos números. La palabra clave params debe estar en una matriz, y si no es el único parámetro en el método, debe ser la última. Solo un parámetro puede tener la declaración param.

+0

OK, pero ¿por qué recuerdo el uso de ...? – Bosak

+8

@Bosak: Así es como se hace en Java (aunque el '...' viene después del nombre del tipo). –

+0

Oh, puede que tengas razón. No sé Java, pero una vez vi un clip sobre algo en Java y dado que se parece mucho a C#, lo confundí. – Bosak

3

que significa ParamArray ? (por vb.net)

para C# que parece que es params

+3

Eso es VB; la pregunta está etiquetada C#. – phoog

+0

@phoog, notado y agregado para C# – Fredou

1

Está buscando la definición c/C++ de una cantidad infinita de argumentos para una función. Se puede ver aquí - http://www.cplusplus.com/reference/cstdarg/va_start/

Una manera fácil de implementar una función tal es así:

1- definir su función, por ejemplo,

void logging(const char *_string, int numArgs, ...) 

primer argumento es la cadena que desea utilizar .

El segundo argumento es el número de argumentos infinitos que desea dar. No tiene que usar este parámetro, si desea contar los marcadores de posición en un interruptor (como% d,% f en printf) -Hint: en un bucle, obtenga cada carácter y observe si es su marcador de posición-.

Quiero dar primero un ejemplo de cómo se podría llamar una función de este tipo:

logging("Hello %0. %1 %2 %3", "world", "nice", "to", "meet you"); // infinite arguments are "world", "nice", ... you can give as much as you want 

Como se puede ver mis marcadores de posición son números. Puedes usar todo lo que quieras.

2- Hay macros, que inicializa la variable de lista y se pone el valor de un argumento:

va_list arguments; // define the list 
va_start(arguments, numArgs); // initialize it, Note: second argument is the last parameter in function, here numArgs 

for (int x = 0; x < numArgs; x++) // in a loop 
{ 
     // Note : va_arg(..) gets an element from the stack once, dont call it twice, or else you will get the next argument-value from the stack 
     char *msg = va_arg(arguments, char *); // get "infinite argument"-value Note: Second parameter is the type of the "infinite argument". 
     ... // Now you can do whatever you want - for example : search "%0" in the string and replace with msg 
} 
va_end (arguments); // we must end the listing 

Si reemplaza cada marcador de posición con los valores de los argumentos infinitos e imprimir la nueva cadena, debería ver esto :

Hello world. un placer conocerte

Espero que ayude ...

+1

[Proporcione más que un enlace como respuesta] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) – ThreeFx

Cuestiones relacionadas