Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

19 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 15 de octubre de 2024
.NET 9 apareciendo en el horizonte

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!