¿Cuál es la diferencia entre eso y simplemente crear un método que reciba una lista o una matriz?
La diferencia entre
void M(params int[] x)
y
void N(int[] x)
es que M puede llamarse así:
M(1, 2, 3)
o así:
M(new int[] { 1, 2, 3 });
pero N solo puede llamarse de la segunda manera, no de la primera .
tal vez tiene algún impacto en el rendimiento?
El impacto en el rendimiento es que, ya sea que llame M
de la primera o de la segunda forma, de cualquier forma obtendrá una matriz creada. La creación de una matriz tiene un impacto en el rendimiento porque requiere tiempo y memoria. Recuerde que los impactos en el desempeño deben medirse contra los objetivos de desempeño; es poco probable que el costo de crear una matriz adicional sea el factor determinante que es la diferencia entre el éxito y el fracaso en el mercado.
No entiendo completamente ni veo de qué manera preferiría el que tiene parámetros ilimitados.
Es pura y enteramente una conveniencia para el autor del código que llama al método; es simplemente más corto y fácil de escribir
M(1, 2, 3);
en lugar de escribir
M(new int[] { 1, 2, 3 });
Simplemente guarda algunas pulsaciones de teclas en el lado de la persona que llama. Eso es todo.
Algunas preguntas que no hizo pero que tal vez le gustaría saber la respuesta a:
¿Cómo se llama esta característica?
Los métodos que permiten pasar un número variable de argumentos en el lado llamante se denominan variables . Los métodos de parámetros son cómo C # implementa métodos variables.
¿Cómo funciona la resolución de sobrecarga con un método variadic?
Cuando se enfrenta a un problema de resolución de sobrecarga, C # considerará las formas "normal" y "expandida", y la forma "normal" siempre gana si ambas son aplicables. Por ejemplo, considere esto:
void P(params object[] x){}
y tenemos una llamada
P(null);
Hay dos posibilidades aplicables. En forma "normal", llamamos P
y pasamos una referencia nula para la matriz. En forma "expandida", llamamos P(new object[] { null })
. En este caso, la forma normal gana. Si recibimos una llamada, P(null, null)
entonces la forma normal no es aplicable y la forma expandida gana por defecto.
Desafío : supongamos que tenemos var s = new[] { "hello" };
y una llamada P(s);
. Describa lo que sucede en el sitio de la llamada y por qué. ¡Te sorprenderías!
Reto : supongamos que tenemos ambos void P(object x){}
y void P(params object[] x){}
. ¿Qué hace P(null)
y por qué?
Reto : supongamos que tenemos ambos void M(string x){}
y void M(params string[] x){}
. ¿Qué hace M(null)
y por qué? ¿Cómo difiere esto del caso anterior?