
Cada vez que llega una nueva versión del framework, todos estamos ansiosos por conocer las novedades, especialmente las más espectaculares. Sin embargo, a veces hay pequeñas mejoras que, sin ser revolucionarias, nos pueden resultar útiles en algunos escenarios.
El modificador params
permite especificar que un método o función acepta un número variable de argumentos, como en el siguiente ejemplo, donde vemos una función Sum()
que puede ser invocada con cualquier número de valores:
// Declaración de la función:
int Sum(params int[] values)
{
return values.Sum();
}
// Ejemplos de uso:
Console.WriteLine(Sum(1)); // Enviamos un único valor -> "1"
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // Enviamos cinco valores -> "15"
Console.WriteLine(Sum()); // No enviamos elementos, se recibirá un array vacío -> "0"
Console.WriteLine(Sum([1, 2, 3])); // Aquí pasamos un array directamente -> "6"
Hasta ahora, el parámetro param
sólo podía ser un array, lo que limitaba un poco su uso. Por ejemplo, no podríamos llamar a la función Sum()
pasándole directamente un List<int>
o un IEnumerable<int>
sin convertirlos antes a array porque fallarían en tiempo de compilación, al no tratarse de un int[]
, que es el tipo del parámetro esperado.
¿Qué ha cambiado?
En .NET 9 se ha añadido soporte para otros tipos de colecciones, por lo que podemos hacer algo más flexible nuestro código. Por ejemplo, ahora podríamos declarar parámetros param
con tipos como List<T>
, HashSet<T>
, Collection<T>
o, en general, cualquier clase o estructura que implemente IEnumerable<T>
:
// Declaración de la función:
int Sum(params IEnumerable<int> values)
{
return values.Sum();
}
// Usos permitidos adicionalmente en .NET 9:
Console.WriteLine(Sum(new List<int> { 1, 2, 3 })); // -> "6"
Console.WriteLine(Sum(new HashSet<int> { 1, 2 })); // -> "3"
Console.WriteLine(Sum(new Collection<int> { 1, 2, 3, 4 })); // -> "10"
Console.WriteLine(Sum(GetNaturalNumbers(10))); // Podemos pasar cualquier IEnumerable<int> -> "55"
IEnumerable<int> GetNaturalNumbers(int count)
{
for (int i = 1; i <= count; i++) yield return i;
}
Los parámetros param
también soportan los tipos Span<T>
y ReadOnlySpan<T>
, por lo que también podríamos escribir código más eficiente cuando este usando estos tipos de datos de más bajo nivel:
Span<int> numbers = stackalloc int[] { 1, 2, 3 };
Console.WriteLine(Sum(numbers));
Console.WriteLine(Sum(1, 2, 3));
int Sum(params Span<int> values)
{
// Sumar de forma más eficiente, por ejemplo usando SIMD...
...
}
En definitiva, se trata de una mejora en el lenguaje que, sin ser espectacular, permite flexibilizar un poco nuestro código y optimizar algunos escenarios, así que bienvenida sea :)
Publicado en Variable not found.
Aún no hay comentarios, ¡sé el primero!
Enviar un nuevo comentario