El modificador de parámetro params
proporciona a los llamantes una sintaxis de acceso directo para pasar múltiples argumentos a un método.Hay dos formas de llamar a un método con un parámetro params
:
1) Llamar con una matriz del tipo de parámetro, en cuyo caso la palabra clave params
no tiene efecto y la matriz se pasa directamente al método:
object[] array = new[] { "1", "2" };
// Foo receives the 'array' argument directly.
Foo(array);
2) O, llamando con una extensa lista de argumentos, en cuyo caso el compilador se ajustará automáticamente la lista de argumentos en una matriz temporal y pasar a que el método:
// Foo receives a temporary array containing the list of arguments.
Foo("1", "2");
// This is equivalent to:
object[] temp = new[] { "1", "2");
Foo(temp);
el fin de pasar en una matriz de objetos a un método con un parámetro "params object[]
", se puede:
1) crear una matriz envoltura manualmente y pase que directamente a la método, como se ha mencionado por lassevk:
Foo(new object[] { array }); // Equivalent to calling convention 1.
2) O bien, el argumento a object
, como mencionado por Adam, en cuyo caso el compilador creará la matriz contenedora para usted:
Foo((object)array); // Equivalent to calling convention 2.
Sin embargo, si el objetivo del método es para procesar múltiples matrices de objetos, puede ser más fácil de declarar con un parámetro explícito "params object[][]
". Esto permitirá pasar varias matrices como argumentos:
void Foo(params object[][] arrays) {
foreach(object[] array in arrays) {
// process array
}
}
...
Foo(new[] { "1", "2" }, new[] { "3", "4" });
// Equivalent to:
object[][] arrays = new[] {
new[] { "1", "2" },
new[] { "3", "4" }
};
Foo(arrays);
Editar: Raymond Chen describe este comportamiento y cómo se relaciona con la especificación de C# en a new post.
la forma en que params funciona parece innecesario, y el diseño de C# no es óptimo, dado lo que nos hemos acostumbrado en otros lenguajes. los params podrían haber sido hechos para aceptar solo un formulario, y se podría agregar una característica de propagación similar que beneficiaría a todo el lenguaje, no solo a este caso. por ejemplo, podríamos forzar que todas las llamadas de param sean Foo (obj [0], obj [1]), y luego tener un operador separado separado permitiendo Foo (... obj). – Lee
se dio cuenta de que no había dejado claro que tengo un gran respeto por Anders Hejlsberg, es uno de los mejores diseñadores de idiomas del mundo. pero podemos pensar en mejoras para el trabajo de cualquiera con suficiente perspectiva, por lo tanto, tecnología. – Lee