Microsoft ha lanzado .NET 11, un lanzamiento con Soporte de Término Estándar (STS) que introduce C# 15 como la versión de lenguaje predeterminada. La actualización se centra en reducir la fricción del desarrollador optimizando la experiencia de la línea de comandos y proporcionando una nueva infraestructura para que los agentes de IA interactúen con la lógica de las aplicaciones.

Evolución del lenguaje y C# 15

C# 15 trae tipos de unión, que permiten que un valor sea uno de un conjunto declarado de tipos de caso. Esto permite a los desarrolladores manejar múltiples estados posibles con comprobación de exhaustividad en expresiones switch sin recurrir a tipos de objeto genéricos o clases base no relacionadas.

Un listado de código que demuestra los tipos de unión de C# 15 y la coincidencia de patrones.
C# 15 introduce tipos de unión para permitir patrones más expresivos y verificados por el compilador en la lógica de las aplicaciones.devblogs.microsoft.com

Esta captura de pantalla ilustra la implementación práctica de los tipos de unión y las jerarquías cerradas en C# 15.

El lanzamiento también introduce jerarquías cerradas, que limitan la derivación directa de una clase a su ensamblaje declarador. Esto proporciona al compilador la información necesaria para verificar patrones sobre un modelo de herencia específico, complementando la flexibilidad de los tipos de unión.

“Los tipos de unión son una de sus mayores adiciones: un valor puede ser uno de un conjunto declarado de tipos de caso, con conversiones desde esos tipos y comprobación de exhaustividad en expresiones switch.”

— Announcing .NET 11 - .NET Blog

Optimización del flujo de trabajo del desarrollador

Para reducir el tiempo de espera en la ejecución de herramientas, el SDK de .NET 11 ahora habilita por defecto un host de CLI Native AOT. Esto permite que comandos como 'help' y 'version' se ejecuten sin iniciar la CLI gestionada, mientras que el servidor MSBuild permanece activo entre invocaciones para evitar el trabajo repetido de inicio.

Para aplicaciones basadas en archivos, los desarrolladores ahora pueden usar la directiva #:include para expandir el código a través de múltiples archivos de origen. Además, la herramienta 'dotnet watch' ha sido actualizada con integración de host de aplicaciones Aspire y recuperación de fallos para proyectos móviles.

Runtime Async y mejoras de rendimiento

Uno de los cambios arquitectónicos más significativos es 'Runtime Async', una función de vista previa que traslada la suspensión y reanudación asíncronas al tiempo de ejecución. Al eliminar la necesidad de máquinas de estado generadas por el compilador, el tiempo de ejecución puede proporcionar una pila de llamadas en vivo más clara, permitiendo que los analizadores de rendimiento y depuradores muestren los métodos asíncronos reales en lugar de la infraestructura subyacente.

El lanzamiento incluye cientos de optimizaciones de tiempo de ejecución, incluyendo mejoras en el compilador JIT que eliminan comprobaciones de límites redundantes y mejoran la desvirtualización. También amplía el soporte de hardware para incluir instrucciones FP16 para operaciones Half en hardware x64 y Arm64 compatible.

Integración de IA y capacidades agénticas

Microsoft está posicionando .NET 11 como una base para el desarrollo 'agéntico'. El SDK incluye una plantilla de servidor MCP (Model Context Protocol) para ayudar a las aplicaciones de IA a descubrir y llamar a herramientas, mientras que Microsoft.Extensions.AI proporciona abstracciones estándar como IChatClient para el acceso a modelos.

El Microsoft Agent Framework (MAF) se basa en estas abstracciones para coordinar agentes y código de aplicaciones. Estas herramientas pueden integrarse con ASP.NET Core para crear experiencias Blazor interactivas utilizando el Agent User Interaction Protocol (AG-UI).

Limitaciones y compensaciones

Si bien el lanzamiento ofrece mejoras significativas, algunas funciones permanecen en vista previa o tienen limitaciones específicas. Por ejemplo, Runtime Async no es el comportamiento predeterminado y requiere una suscripción manual a través de un PropertyGroup para utilizar el nuevo modelo de compilación.

Además, aunque System.Text.Json ahora admite uniones discriminadas de F#, esta implementación específica no admite generación de código, recorte (trimming) o Native AOT. Los desarrolladores deben verificar estos límites documentados antes de usar la función en aplicaciones recortadas.

Qué dicen los lectores de Hacker News

  • Nota técnica: Un comentarista señaló un cambio específico en cómo se manejan los decimales, notando que .NET 11 parece producir resultados de precisión diferentes en comparación con .NET 10. comentario ↗
  • Nota técnica: Un comentarista expresó sorpresa respecto al cambio hacia la ejecución asíncrona gestionada por el tiempo de ejecución, cuestionando si esto implica el uso de corrutinas con pila (stackful coroutines). comentario ↗
  • Escéptico: Varios comentaristas expresaron escepticismo sobre la viabilidad a largo plazo de la plataforma, citando experiencias pasadas con tecnologías abandonadas y la falta de un stack de GUI multiplataforma. comentario ↗
  • Experiencia: Un desarrollador que utiliza .NET para backends de IA informó que el marco es altamente efectivo para estas aplicaciones, especialmente cuando se ejecuta en contenedores Linux. comentario ↗

Resumen de opiniones del hilo de Hacker News; no son hechos verificados. Leer el debate completo ↗