
Una de las novedades más destacables de .NET 9 es, sin duda, el nuevo sistema de caché híbrida (Hybrid cache), una puesta al día del sistema de caché distribuida que nos acompaña desde las primeras versiones de .NET Core, y al que iban haciendo falta ya algunas mejoras.
Este nuevo sistema está construido encima de la infraestructura de caching existente (Microsoft.Extensions.Caching
), añadiendo mejoras que hacen que su uso sea más sencillo y contemplando de serie funcionalidades que antes nos veíamos obligados a implementar manualmente.
Vamos a echarle un vistazo a sus principales características :)
Disclaimer: lo que vamos a ver a continuación está basado en .NET 9 RC2, por lo que todavía es posible que haya cambios en la versión final.

Como todos los principios de semana, aquí va la lista de enlaces recopilados durante los últimos siete días. Hay bastantes cosas que me han llamado la atención en esta ocasión; entre otros, he descubierto que Visual Studio incluye un visualizador de JWT integrado, el atributo [OverloadResolutionPriority]
de .NET 9/C#13, y también me he preguntado cuántos son muchos índices en una tabla SQL 😕
Por si te lo perdiste...
- Añadir o eliminar encabezados de respuesta en ASP.NET Core y Core MVC
José M. Aguilar - Obtener el valor de parámetros de la query string con JavaScript
José M. Aguilar
.NET Core / .NET
- Runnable examples
Sergio León - Trace sampling in SerilogTracing
Nicholas Blumhardt - What's new in System.Text.Json in .NET 9
Eirik Tsarpalis - Safety and simplicity with LINQ
Andrew Lock - C# Tip: IEnumerable vs ICollection, and why it matters
Davide Bellone - Understanding OverloadResolutionPriority attribute in C# 13
Gérald Barré - What's new in .NET 9: Cryptography improvements
Ali Hamza Ansari - Automatic Upgrade of .NET and External Dependency Versions, Converting Assembly to Package References and More
Dennis Garavsky - .NET 9.0 LINQ Performance Improvements
NDepend Team - Extending MediatR with publishing strategies
Fati Iseni

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?

Aquí tenemos la recopilación de enlaces de la semana. Entre ellos, me han llamado especialmente la atención los datos que muestra Trevor I. Lasn en su artículo sobre el factor edad en el mundo tecnológico, probablemente porque estoy en el 15% del que habla, los desarrolladores que vuelan ya por encima de los 45 tacos 😆
Y aparte, como siempre, un poco de ASP.NET Core, datos, IA, programación web y otros temas que espero que os resulten interesantes 🙂
Por si te lo perdiste...
- Custom middlewares en ASP.NET Core
José M. Aguilar - ¡No uses Replace() para eliminar los guiones de un GUID en .NET!
José M. Aguilar
.NET Core / .NET
- .NET 9 Release Candidate 2 is now available!
.NET Team - Embedding Python into your .NET project with CSnakes
Tony Baloney - Centralize your packages in .NET with NuGet
Steven Giesel - Unleashing .NET 9: Key Performance Boosts and Pitfalls Compared to .NET 8
David McCarter - .NET 8 vs .NET 9: What's the Difference and Should you Migrate?
Cheyenne Sokkappa - Replacing Exceptions-as-flow-control with the result pattern
Andrew Lock - How To Simplify Assertions in Unit and Integration Tests with Verify in .NET
Anton Martyniuk - Domain Events with .NET
Visit profile - Avoiding Repetitive Code With Metalama
Gael Fraiteur - Using Windows Error Reporting in .NET
Kevin Gosse - Have you ever memory-profiled in a unit test?
Dennis Frühauff - Engineering the Scalable Vector Extension in .NET
Kunal Pathak - Typed chat completions with OpenAI and .NET 9
Daniel Cazzulino - Cancellation, Part 6: Linking
Stephen Cleary - Advanced Unit Testing in .NET with xUnit, NSubstitute, and AutoFixture: A Deep Dive into my HangfireDemoApi
Juan Luis Guerrero

Probablemente, todos hemos usado en algún momento el método Guid.NewGuid()
de .NET para generar identificadores únicos globales. Y muchos hemos sufrido con el problema que supone su (pseudo) aleatoriedad, principalmente cuando necesitamos ordenarlos... sobre todo si su destino final es acabar siendo el campo clave de una base de datos relacional.
Pero pocos éramos conscientes de que el método Guid.NewGuid()
de .NET retorna un GUID versión 4, y que existen otras versiones de UUID (¡hasta 8!) que pueden resultar más beneficiosas en determinados escenarios.

Una semana más, aquí tenéis los enlaces recopilados durante la semana pasada, con mucho protagonismo de los últimos lanzamientos de OpenAI que, si usáis sus APIs o planeáis hacerlo, seguro que os interesarán: la API realtime y el prompt caching.
Por si te lo perdiste...
- El filtro [OutputCache], por fin de vuelta en ASP.NET Core
José M. Aguilar - Gestionar errores 404 (y otros) en ASP.NET Core y MVC
José M. Aguilar
.NET Core / .NET
- What's New in .NET 9: A Developer's Perspective
Vinoth Kumar Sundara Moorthy - How To Test Integrations with APIs Using WireMock in .NET
Anton Martyniuk - How to use IHttpClientFactory and WireMock.NET together using Moq
Davide Bellone - Getting the Running Operating System in C#
Bryan Hogan - Serilog fallback sinks
Nicholas Blumhardt - An Efficient Dictionary for IPAddress Tracking using .NET 9 with AlternateLookup and IAlternateEqualityComparer
Steve Gordon - Effortlessly Upload Files and Data in .NET applications using HttpClient
Hariom Dubey - .NET's ActivityListener sampling API
Nicholas Blumhardt - Visualizing the Serilog 4.1 batch retry algorithm
Nicholas Blumhardt