Microsoft ha anunciado el lanzamiento de la versión definitiva de .NET 9. Entre sus novedades destacan, como siempre, las mejoras significativas en rendimiento y seguridad, pero por supuesto mucha IA generativa y cuestiones relevantes en el stack de desarrollo web.
.NET 9 incluye actualizaciones para ASP.NET Core, Blazor, C#, F#, .NET MAUI, y herramientas de desarrollo como Visual Studio y Visual Studio Code.
Como todo de 2 años para acá, se hace especial hincapié en el ecosistema de IA generativa, con nuevas abstracciones para integrar servicios de este tipo de modelos en nuestras aplicaciones .NET.
En cuanto a desarrollo Web tenemos características como la optimización del manejo de archivos estáticos en ASP.NET Core, la caché hibrida o el nuevo renderizador interactivo en Blazor.
Vamos a darle un repaso a las principales cuestiones...
Mientras puedes ir descargándote la última versión desde aquí. También puedes actualizar Visual Studio a la versión más reciente para obtener las mejoras así como todo lo necesario para desarrollar con esta versión (incluyendo, claro está, el SDK anterior).
Rendimiento cada vez mayor en .NET 9
Como con cada versión "major" que lanza Microsoft en noviembre, .NET 9 promete ser la versión con mayor rendimiento hasta la fecha. Esto lo han logrado a través de más de 1.000 cambios implementados en el runtime, las cargas de trabajo y los lenguajes de programación.
Uno de los cambios más significativos se encuentra en el recolector de basura del servidor (Server GC). Antes, este se ajustaba a los recursos disponibles en el entorno (máquina, máquina virtual o contenedor). Ahora, el Server GC se adapta de manera inteligente a las necesidades de memoria de la propia aplicación. Este cambio tiene un impacto importante en entornos con muchos núcleos de procesador, donde la memoria de la aplicación es limitada o fluctúa considerablemente.
Además, .NET 9 vuelve a sacar partido a la vectorización para aprovechar la potencia de los nuevos procesadores de última generación, tanto los Arm64 SVE como los Intel AVX10, acelerando mucho el runtime en este tipo de hardware.
El benchmark de referencia, TechEmpower muestra claramente el impacto de estas mejoras, con un mayor rendimiento y una reducción drástica del uso de memoria:
Las mejoras no se limitan solo al runtime. LINQ, un componente fundamental de .NET, también se ha optimizado para casos de uso comunes, resultando en un aumento de velocidad de hasta 10 veces en algunos métodos como Take
o DefaultIfEmpty
.
En general, .NET 9 ha experimentado una optimización profunda a través de múltiples capas, lo que se traduce en aplicaciones más rápidas y eficientes con un menor consumo de recursos. Para no extenderme más, si te interesa el tema, Stephen Toub de Microsoft escribió en septiembre un artículo largo, técnico y detallado sobre las mejoras de rendimiento.
Novedades de ASP.NET Core y Blazor en .NET 9
.NET 9 nos trae una serie de mejoras a ASP.NET Core y tecnologías relacionadas, enfocadas en la eficiencia, la seguridad y una mejor experiencia de desarrollo.
Un área clave de mejora en esta versión es el manejo de archivos estáticos, esenciales en casi todas las aplicaciones web. ASP.NET Core ahora optimiza estos archivos (como imágenes, archivos JavaScript o CSS, etc) durante la compilación y la publicación. Durante la compilación, se generan versiones con huella digital de estos archivos, añadiendo un hash basado en el contenido al nombre del archivo. Esto asegura la unicidad del nombre, evitando el uso de versiones obsoletas y permitiendo un almacenamiento en caché más agresivo. Además, los archivos se comprimen previamente con Brotli durante la publicación, reduciendo significativamente su tamaño de descarga y liberando al servidor de la tarea de compresión.
Puedes leer también sobre la nueva Caché Híbrida de .NET 9 en este artículo de nuestro tutor José María Aguilar.
Por otro lado, Blazor, el framework para construir interfaces web interactivas con C#, también se ha visto mejorado en .NET 9. De hecho, Microsoft le está dando cada vez más protagonismo. Ahora puede detectar el modo de renderizado del componente en tiempo de ejecución utilizando la nueva API RendererInfo
y ajustar el renderizado del componente en consecuencia. Esto permite deshabilitar u ocultar elementos interactivos durante la prerenderización y habilitarlos una vez que el componente es ya interactivo. Esto mejora la experiencia del usuario. Además, las aplicaciones Blazor Server ahora disfrutan de una nueva experiencia de reconexión, con una interfaz de usuario más amigable, una reconexión al servidor más rápida y una gestión automática de la recarga de la página en caso de pérdida de conexión.
Para el desarrollo de APIs, .NET 9 introduce soporte integrado para la generación de documentos OpenAPI utilizando el paquete Microsoft.AspNetCore.OpenAPI
. Los metadatos se extraen automáticamente del código de la aplicación, atributos y métodos de extensión, y el documento se puede personalizar aún más con transformadores que operan en operaciones, esquemas o el documento en su conjunto. En las aplicaciones que utilizan la Minimal API, esta característica es compatible con AOT nativo (compilación anticipada), lo que permite optimizar las aplicaciones para obtener un rendimiento mayor. El documento OpenAPI también se puede generar durante la compilación e integrarse en los flujos de trabajo de desarrollo local y las canalizaciones de compilación que utilizan herramientas OpenAPI.
La seguridad también es un aspecto central de las mejoras en ASP.NET Core. Ahora es más fácil configurar un certificado de desarrollo de confianza en Linux para habilitar HTTPS durante el desarrollo. Blazor cuenta con nuevas API integradas para transmitir el estado de autenticación al cliente y se ha añadido extensibilidad para agregar parámetros adicionales a las solicitudes de autorización OAuth y OIDC. También se ha incluido soporte para Pushed Authorization Requests (PAR). Por último, se ha reforzado el soporte de protección de datos de ASP.NET Core y se han mejorado las métricas de conexión de Kestrel, el servidor web integrado en .NET, para facilitar la detección de fallos de conexión.
Todas las novedades de ASP.NET 9, aquí: Novedades de ASP.NET Core 9.0.
Novedades en desarrollo multiplataforma: .NET MAUI 9
.NET MAUI es la herramienta de Microsoft para construir aplicaciones multiplataforma con .NET, tanto para dispositivos móviles como para escritorio. En esta nueva versión 9, el enfoque principal ha sido como siempre mejorar la calidad y la fiabilidad para facilitar la entrega de aplicaciones en producción, lo cual indica que hasta ahora seguían sin tenerla afinada del todo.
Según Microsoft, el uso de .NET MAUI ha crecido más del 30% desde el año pasado, alcanzando su máximo histórico. Las aplicaciones construidas con .NET MAUI en Google Play Store se han duplicado en el último año.
Un aspecto importante en esta versión es la incorporación de contribuciones de la empresa Syncfusion, un fabricante muy conocido de componentes para .NET, amigos de campusMVP desde hace muchos años. Entre julio y septiembre de este año 2024, Syncfusion ha aportado más del 55% del total de las contribuciones de la comunidad al proyecto .NET MAUI, lo que representa un aumento del 557% en comparación con los tres meses anteriores. Gracias a ello, .NET 9 introduce una nueva plantilla de proyecto para MAUI que incluye 14 controles Syncfusion gratuitos y de código abierto, junto con otras bibliotecas populares de la comunidad. Esta plantilla busca demostrar las mejores prácticas para MVVM, acceso a bases de datos, navegación, actualización de vistas y otros patrones comunes en el desarrollo de aplicaciones.
Como ya vimos antes, .NET 9 trae muchas mejoras de rendimiento y fiabilidad, y MAUI no es una excepción. Se han implementado mejoras de rendimiento en todo .NET MAUI, incluyendo una nueva implementación de CollectionView
y CarouselView
para iOS y Mac Catalyst. Las actualizaciones en los controles existentes, el ciclo de vida de la aplicación, Native AOT y las mejoras de recorte permiten crear aplicaciones más pequeñas y rápidas.
Además del soporte para las versiones más recientes de los sistemas operativos iOS, macOS y Android, también han metido nuevas capacidades de la plataforma nativa. Estas incluyen paquetes de recursos de Android, interoperabilidad mejorada con bibliotecas nativas e integración optimizada entre Xcode y Visual Studio Code a través de la nueva herramienta Xcode Sync.
Puedes leer todo el detalle de novedades de .NET MAUI en el blog de Microsoft.
Desarrollo para Windows en .NET 9
.NET 9 se presenta como una versión crucial para los desarrolladores de Windows, brindando acceso a las últimas características y capacidades del sistema operativo, al mismo tiempo que garantiza un rendimiento y accesibilidad sin precedentes. Tanto para nuevas aplicaciones modernas con WinUI 3 y Windows App SDK como para la modernización de aplicaciones WPF y WinForms existentes, .NET 9 trae algo para todo el mundo que desarrolla para Windows.
En esta versión, Microsoft ha trabajado en estrecha colaboración con la comunidad de desarrolladores de Windows para incorporar características ampliamente solicitadas. Entre las mejoras más destacadas se encuentra el soporte de Native AOT para WinUI 3, lo que permite crear aplicaciones más pequeñas y con un rendimiento superior. WPF se beneficia de las mejoras en la temática moderna con Fluent UI, mientras que WinForms recibe una actualización con un nuevo modo oscuro, API modernas para iconos y un acceso mejorado a las API asíncronas mediante Control.InvokeAsync
.
Estas mejoras, junto con los avances en rendimiento general de .NET 9 que ya se comentaron, como la optimización del Server GC y la vectorización del runtime, prometen una experiencia de desarrollo más fluida y eficiente para los desarrolladores de Windows.
Si te interesa el desarrollo de aplicaciones de escritorio pero la gran cantidad de opciones que tiene .NET te hacer volar la cabeza 🤯 esto te va a ayudar mucho: .NET: Eligiendo el framework de Interfaz de Usuario más adecuado para crear aplicaciones de escritorio.
Novedades en C# 13 con .NET 9
El lenguaje C# continúa su camino de mejora con la versión 13, que se entrega junto a .NET 9, y presenta algunas características y mejoras, aunque quizá menos de las que nos tiene acostumbrados en releases anteriores. Estas novedades incluyen nuevas características que mejoran la eficiencia, la legibilidad y la seguridad del código. En concreto:
- Colecciones con
params
: el modificador params
ya no se limita a tipos de array. Ahora se puede usar con cualquier tipo de colección reconocido, incluyendo System.Span<T>
, System.ReadOnlySpan<T>
, y tipos que implementan System.Collections.Generic.IEnumerable<T>
y tienen un método Add
. Esto ofrece una mayor versatilidad al trabajar con conjuntos de datos variables.
- Nuevo objeto
lock
: se introduce el tipo System.Threading.Lock
para la sincronización de hilos. Este tipo proporciona una mejor sincronización a través de su API. El método Lock.EnterScope()
ingresa a un ámbito exclusivo. El ref struct
devuelto admite el patrón Dispose()
para salir del ámbito exclusivo. La instrucción lock
en C# ahora reconoce si el objetivo es un objeto Lock
. De ser así, utiliza la API actualizada en lugar de la API tradicional que usa System.Threading.Monitor
.
- Nueva secuencia de escape: se introduce
\e
como una secuencia de escape para el carácter ESCAPE
(Unicode U+001B
). Anteriormente se usaba \u001b
o \x1b
, pero esta última no se recomendaba por posibles ambigüedades con dígitos hexadecimales subsiguientes.
- Mejoras en el tipo natural de grupo de métodos: se realizan optimizaciones en la resolución de sobrecargas que involucran grupos de métodos. El compilador ahora elimina los métodos candidatos no aplicables en cada ámbito, siguiendo más de cerca el algoritmo general de resolución de sobrecargas.
- Acceso implícito al indexador: el operador de índice implícito "desde el final",
^
, ahora se permite en expresiones de inicializador de objeto. Esto facilita la inicialización de matrices dentro de un inicializador de objeto utilizando índices desde el final, simplificando la sintaxis. Por ejemplo:
var v = new S() {
buffer = {
[^1] = 0,
[^2] = 1,
[^3] = 2,
[^4] = 3,
[^5] = 4,
[^6] = 5,
[^7] = 6,
[^8] = 7,
[^9] = 8,
[^10] = 9
}
};
En versiones anteriores a C# 13, el código anterior requería indexar los elementos desde el principio.
ref
y unsafe
en iteradores y métodos asíncronos: los métodos async
ahora pueden declarar variables locales ref
o variables locales de un tipo ref struct
, aunque con restricciones en su acceso. C# 13 también permite contextos unsafe
en métodos iteradores, con la condición de que las instrucciones yield return
y yield break
estén en contextos seguros.
- Permitir
ref struct
como argumentos para parámetros de tipo: las declaraciones de tipos genéricos pueden agregar una anti-restricción, allows ref struct
. Esta anti-restricción declara que el argumento de tipo proporcionado para ese parámetro de tipo puede ser un tipo ref struct
.
- Interfaces
ref struct
: los tipos ref struct
ahora pueden implementar interfaces. Sin embargo, para garantizar las reglas de seguridad de ref
, un tipo ref struct
no se puede convertir a un tipo de interfaz.
- Más miembros
partial
: se pueden declarar propiedades partial
e indexadores partial
en C# 13.
- Prioridad de resolución de sobrecarga: el compilador reconoce el atributo
OverloadResolutionPriorityAttribute
para preferir una sobrecarga sobre otra.
- La palabra clave
field
(en vista previa): la palabra clave contextual field
accede al campo de respaldo sintetizado por el compilador en un descriptor de acceso de propiedad. Permite escribir un cuerpo de descriptor de acceso sin declarar un campo de respaldo explícito en la declaración de tipo. Esta característica está disponible como vista previa y requiere la configuración <LangVersion>
a preview
en el archivo de proyecto.
Aunque muchas de estas novedades parezcan poco prácticas para un uso diario del lenguaje, contribuyen a una experiencia de desarrollo más eficiente y legible, facilitando la escritura de código más conciso y seguro, mejorando la productividad del desarrollador.
Todos los detalles, en el artículo What's new in C# 13 (OJO: léelo en ingles. Si te sale en español cambia el idioma porque tiene solo una pequeña parte del contenido).
Novedades de F# 9 en .NET 9
F# 9, la última versión del lenguaje de programación funcional de .NET, introduce una serie de mejoras diseñadas para hacer que tus programas sean más seguros, robustos y eficientes. Las actualizaciones se centran en la seguridad de tipos, el rendimiento y la productividad del desarrollador.
- Tipos de referencia que aceptan valores nulos: una de las adiciones clave en F# 9 es la compatibilidad con tipos de referencia que aceptan valores nulos, lo que mejora la interoperabilidad con las bibliotecas de C#. Esta característica permite una mejor verificación de tipos en tiempo de compilación, lo que lleva a programas más seguros y fiables.
- Rangos integrales optimizados: se han implementado optimizaciones significativas para los rangos integrales, como los utilizados en bucles
for
. Estas optimizaciones dan como resultado un código más rápido y eficiente, especialmente para operaciones que involucran bucles y comprehensiones.
- Comprobaciones de igualdad optimizadas: las comprobaciones de igualdad ahora se optimizan para evitar el boxing/unboxing, un proceso que puede afectar negativamente al rendimiento. Estas mejoras aumentan la eficiencia de muchas operaciones comunes, mejorando la velocidad general de los programas.
- Propiedades
Is\*
autogeneradas para uniones discriminadas: las uniones discriminadas ahora generan automáticamente propiedades Is*
que facilitan la comprobación de casos. Esto simplifica el código y lo hace más legible, mejorando la experiencia del desarrollador.
- Funciones aleatorias para colecciones: la biblioteca estándar se ha ampliado para incluir funciones aleatorias para colecciones, lo que resulta útil en áreas como la ciencia de datos y el desarrollo de juegos. Estas funciones proporcionan una forma conveniente de trabajar con datos aleatorios dentro de colecciones.
- Mejoras en el diagnóstico y las herramientas: se han realizado mejoras en el diagnóstico de los fallos, la recuperación del analizador y varias herramientas para mejorar la productividad del desarrollador. Estos cambios facilitan la identificación y corrección de errores, lo que lleva a un proceso de desarrollo más fluido.
F# 9 consolida su posición como un lenguaje de programación funcional de primera clase en la plataforma .NET.
Tienes todos los detalles de estas y otras novedades en un artículo especifico: What's new in F# 9.
.NET Aspire: Construyendo mejores aplicaciones
.NET Aspire es un conjunto de herramientas, plantillas y paquetes diseñados para facilitar el desarrollo de aplicaciones robustas, listas para producción y con capacidad de observabilidad. En otras palabras, .NET Aspire proporciona a los desarrolladores los elementos esenciales para construir aplicaciones de alta calidad que se pueden supervisar y gestionar eficazmente en entornos de producción.
.NET Aspire es interesante por varias razones: simplifica el desarrollo, mejora la calidad del código y facilita la integración con Azure. Te dan muchísimas cosas hechas de las que ya no tendrás que preocuparte.
En la versión .NET Aspire 9, se han introducido mejoras significativas en base a las peticiones de la comunidad de desarrolladores. Estas mejoras incluyen:
- Gestión de recursos desde el panel de control: ahora es posible iniciar y detener recursos directamente desde el panel de control, lo que simplifica la administración de la aplicación.
- Mantenimiento de contenedores activos: los contenedores se pueden mantener activos entre sesiones de depuración, lo que agiliza el flujo de trabajo de desarrollo.
- Nuevas API: se han añadido nuevas API, como
WaitFor
, para gestionar mejor el inicio de los recursos.
- Integraciones: se han implementado nuevas integraciones para OpenAI, Ollama, Milvus y otras herramientas populares, ampliando la funcionalidad de .NET Aspire.
- Implementación simplificada: se ha simplificado el proceso de adquisición e integración de .NET Aspire en las aplicaciones.
- Mejoras en Azure Container Apps: se han mejorado los escenarios de implementación con Azure Container Apps.
- Soporte para Azure Functions: se ha añadido soporte en vista previa para Azure Functions con .NET Aspire.
Un Ecosistema de IA en Crecimiento para .NET
En esta ocasión, .NET 9 no se limita a mejorar las características existentes del lenguaje y los frameworks, sino que también se mete más de lleno en todo lo que tiene que ver con la IA generativa, por la que Microsoft lleva apostando a lo bestia desde sus inicios. El objetivo es proporcionar a los desarrolladores de .NET las herramientas y la infraestructura necesarias para construir e integrar aplicaciones con capacidades de IA generativa con poco esfuerzo.
Uno de los aspectos más destacados es la colaboración con socios clave en el ecosistema de la IA, incluyendo Azure, OpenAI, LlamaIndex, Qdrant, Pinecone, Milvus, AutoGen, OllamaSharp y ONNX Runtime (de la propia Microsoft). Estas colaboraciones buscan ofrecer una amplia gama de opciones para los desarrolladores de .NET que buscan incorporar la IA en sus proyectos.
Para simplificar la integración con la creciente cantidad de APIs y funcionalidades de IA, se han presentado un conjunto de abstracciones en el ecosistema de .NET bajo Microsoft.Extensions.AI
y Microsoft.Extensions.VectorData
. Estas abstracciones proporcionan una capa unificada de C# para interactuar con servicios de IA, incluyendo modelos de lenguaje pequeños y grandes (SLMs y LLMs), embeddings, almacenes de vectores y middleware.
Además de estas abstracciones, .NET 9 también introduce mejoras en las bibliotecas y tipos primitivos para facilitar el desarrollo de IA. Por ejemplo, Microsoft.ML.Tokenizers
se ha mejorado con soporte para familias de modelos populares como GPT, Llama, Phi y Bert, así como nuevos algoritmos de tokenización como Byte-Level BPE, SentencePiece y WordPiece.
También se ha añadido Tensor<T>
, un nuevo tipo para representar datos multidimensionales, que simplifica la interoperabilidad entre bibliotecas de IA.
.NET 9: Versión Estándar, No LTS
Es importante destacar que .NET 9 no es una versión de Soporte a Largo Plazo (LTS). Esto significa que Microsoft proporcionará soporte y actualizaciones para .NET 9 durante un período más corto en comparación con las versiones LTS. Las versiones LTS, como .NET 8, reciben soporte durante tres años, mientras que las versiones estándar como .NET 9 tienen un ciclo de soporte de 18 meses.
Si bien .NET 9 ofrece una gran cantidad de características nuevas y mejoras, es importante considerar el ciclo de soporte más corto al decidir si se debe adoptar para proyectos a largo plazo. Para aquellos que buscan estabilidad a largo plazo, se recomienda permanecer en una versión LTS como .NET 8 hasta la próxima versión LTS.
Si te interesa saber cómo funcionan las versiones de .NET y qué significa que sean con soporte LTS o Estandar, entre otras muchas cosas, te dejamos este recurso indispensable: ¿.NET 7 no soportado, pero .NET 6 sí? - Cómo funcionan las versiones en .NET.
Conclusiones: .NET 9, un paso más hacia el futuro
.NET 9 se presenta como una versión que consolida la posición de .NET como una plataforma robusta, versátil y de alto rendimiento para el desarrollo de aplicaciones modernas. Esta versión no se limita a mejoras incrementales, sino que introduce cambios significativos en áreas clave que impulsan la productividad del desarrollador y abren nuevas posibilidades en campos como la IA y el desarrollo web.
En lo que respecta a los lenguajes de programación, C# 13 continúa su evolución con nuevas características que aumentan la flexibilidad y eficiencia del código. F# 9, por su parte, se centra en la seguridad de tipos, el rendimiento y la interoperabilidad con C#. Ambas actualizaciones demuestran el compromiso de Microsoft con la mejora continua de los lenguajes de .NET.
En el ámbito del desarrollo web, ASP.NET Core y Blazor se benefician de mejoras significativas en rendimiento, seguridad y accesibilidad. Las nuevas características y optimizaciones hacen que el desarrollo web con .NET sea aún más atractivo.
.NET MAUI y las demás opciones para crear aplicaciones de interfaz de usuario en varias plataformas se estabilizan, se consolidan y añaden mucha nueva funcionalidad.
.NET Aspire se posiciona como un conjunto de herramientas esenciales para la construcción de aplicaciones listas para producción. Su enfoque en la observabilidad, la integración con Azure y la facilidad de uso lo convierten en un componente fundamental para el desarrollo de aplicaciones modernas con .NET.
La integración de la IA en .NET 9 es uno de los puntos más destacados. La colaboración con líderes de la industria, las nuevas abstracciones y las mejoras en las bibliotecas proporcionan a los desarrolladores de .NET un conjunto completo de herramientas para construir aplicaciones inteligentes. El objetivo es claro: democratizar el acceso a la IA y permitir que los desarrolladores de .NET aprovechen su potencial.
En resumen: .NET 9 es una versión que consolida los puntos fuertes de .NET y la impulsa hacia el futuro y la refuerza como una de las plataformas más capacitadas para afrontar los retos del desarrollo de software moderno.