Microsoft publicó .NET 11 Preview 5, y esta vale la pena mirarla de cerca. No es solo un drop de runtime y arreglo de bugs. La Preview 5 deja varias señales de hacia dónde va la plataforma: C# avanza hacia un modelado de dominio más fuerte, LINQ tapa huecos de larga data en el modelado de datos, Blazor SSR sigue volviéndose más práctico, y el SDK apuesta más fuerte por las apps basadas en archivos y los flujos de trabajo con agentes.
Las release notes oficiales listan cambios en el runtime, las librerías, el SDK, C#, ASP.NET Core, .NET MAUI y EF Core. Estos son los cambios que creo que más importan para quienes hacen backend, cloud y aplicaciones.
C# 15: jerarquías cerradas y uniones
Lo más interesante de la Preview 5 está en C#.
C# ahora tiene soporte en preview para jerarquías de clases closed. Una clase cerrada solo puede heredarse de forma directa dentro del mismo ensamblado, lo que permite al compilador razonar sobre todos los subtipos directos alcanzables y verificar la exhaustividad de las switch-expressions.
public closed record class GateState;
public record class Closed : GateState;
public record class Open(float Percent) : GateState;
static string Describe(GateState state) => state switch
{
Closed => "closed",
Open(var percent) => $"{percent}% open"
};Esto es útil para modelar estados finitos sin dejar que cada consumidor adivine si un switch se olvidó de un caso.
La Preview 5 también introduce las declaraciones union y los patrones de unión. Una unión crea un tipo por valor que puede contener uno de un conjunto fijo de tipos de caso.
public record class Dog(string Name);
public record class Cat(int Lives);
public union Pet(Dog, Cat);
static string Describe(Pet pet) => pet switch
{
Dog(var name) => $"dog: {name}",
Cat(var lives) => $"cat: {lives}"
};Durante años, los desarrolladores de C# usaron records, herencia, librerías estilo OneOf o tipos result a medida para aproximar las uniones discriminadas. Este preview no significa que el diseño esté cerrado, pero es un gran paso hacia un modelado de estilo algebraico de primera clase en C#.
Mi lectura: si esto madura bien, puede mejorar cómo modelamos estados de dominio, resultados de comandos, resultados de validación, transiciones de workflow y respuestas de API.
Librerías: JSON Lines, FullJoin, X25519 y mejores comparadores
System.Text.Json ahora puede serializar IAsyncEnumerable<T> como JSON Lines usando JsonSerializer.SerializeAsyncEnumerable(..., topLevelValues: true).
Eso importa para logs, exportaciones en streaming, pipelines de datos, feeds de eventos y procesamiento por lotes, donde cada valor JSON debería escribirse como una línea separada en vez de envolver todo en un único array grande.
LINQ también suma FullJoin para Enumerable, Queryable y AsyncEnumerable.
var rows = catalog.FullJoin(
sales,
product => product.Sku,
sale => sale.Sku,
(product, sale) => new
{
Sku = product?.Sku ?? sale!.Sku,
ProductName = product?.Name ?? "(not in catalog)",
QuantitySold = sale?.Quantity ?? 0,
});Esta es una de esas features que parecen menores hasta que las necesitás. Los full outer joins son comunes al reconciliar dos conjuntos de datos: servicios configurados vs. descubiertos, inventario esperado vs. observado, snapshots viejos vs. nuevos, o catálogo vs. ventas.
Otras adiciones útiles en las librerías:
EqualityComparer<T>.Create(...)ahora soporta creación con selector de clave, útil cuando la igualdad debería basarse en una propiedad para una colección concreta sin cambiar el tipo de forma global.Randomsuma APIs numéricas genéricas comoNextInteger<T>()yNextBinaryFloat<T>().StringBuilder.MoveChunks(...)puede transferir chunks internos sin copiar, útil para parsers y generadores.- Cryptography suma
X25519DiffieHellman, la curva de acuerdo de claves X25519 que usan protocolos modernos como TLS 1.3, Signal y Noise.
Runtime: suspensión async, JIT, GC y WebAssembly CoreCLR
La Preview 5 incluye trabajo de runtime que debería aparecer en su mayoría como mejoras de rendimiento y fiabilidad "gratis".
Las release notes destacan una suspensión y reanudación de runtime-async más rápidas. Microsoft muestra un benchmark intensivo en suspensión que baja de unos 6357 ms a 457 ms. Es una mejora enorme para escenarios que estresan la suspensión async.
El JIT también elimina más checks redundantes, sobre todo en bucles de span/vectorizados, y mejora varios paths de codegen. El trimming y la compactación del GC también reciben mejoras, incluido un nuevo switch DOTNET_GCTrimYoungestKeepPercent para controlar cuánto de la generación más joven se retiene durante el trimming en modos de poca memoria.
Para WebAssembly, Browser CoreCLR sigue avanzando. Blazor WebAssembly puede optar por CoreCLR con:
<PropertyGroup>
<TargetFramework>net11.0</TargetFramework>
<UseMonoRuntime>false</UseMonoRuntime>
</PropertyGroup>Esto sigue siendo territorio preview/opt-in, pero muestra la dirección: una historia de runtime más unificada entre cargas de trabajo.
SDK: las apps basadas en archivos maduran, y MCP llega a dotnet new
Los cambios del SDK están muy alineados con hacia dónde va el tooling de desarrollo.
Las apps basadas en archivos ahora pueden referenciar otros archivos C#:
#:ref lib.cs
Console.WriteLine(MyLib.Greeter.Greet("World"));Eso hace que el C# basado en archivos sea menos un juguete y más útil para scripts, prototipos, herramientas pequeñas, demos y utilidades generadas por agentes.
Los comandos de la CLI también manejan las apps basadas en archivos de forma más consistente:
dotnet package add app.cs System.CommandLine
dotnet package list app.cs
dotnet nuget why app.cs System.CommandLineEl SDK también puede chequear SDKs vulnerables o fuera de soporte durante el build:
<PropertyGroup>
<CheckSdkVulnerabilities>true</CheckSdkVulnerabilities>
</PropertyGroup>Los nuevos warnings incluyen:
NETSDK1236para SDKs con vulnerabilidades conocidas.NETSDK1237para SDKs fuera de soporte (end-of-life).
Y sí: dotnet new ahora incluye una plantilla de servidor MCP.
dotnet new mcpserver --transport localEsa es una señal fuerte. Microsoft está convirtiendo la integración de agentes/herramientas en un path de primera clase del SDK, no solo en un agregado del ecosistema.
ASP.NET Core y Blazor: SSR sigue volviéndose más útil
Los formularios de Blazor SSR ahora soportan validación del lado del cliente cuando se usa DataAnnotationsValidator, dando feedback instantáneo en el navegador sin un round trip al servidor.
Blazor también suma bloques de construcción para validación async de formularios, para escenarios como chequear la disponibilidad de un nombre de usuario, lookups en base de datos o validación remota.
La localización de la validación ahora está soportada en Blazor y Minimal APIs, incluida la localización basada en RESX y estrategias personalizadas con IStringLocalizerFactory.
QuickGrid también es más útil en escenarios de SSR estático. El ordenamiento y la paginación pueden funcionar sin interactividad usando estado en la URL/query-string en vez de requerir un circuito o el runtime de WebAssembly.
Eso es importante porque hace que Blazor SSR sea más viable para páginas rápidas, simples y compartibles.
Otras mejoras de ASP.NET Core incluyen:
- Blazor WebAssembly preservando la cultura del servidor durante el prerendering/hydration.
[SupplyParameterFromSession]para estado de componente respaldado por sesión.- Un nuevo servidor de desarrollo Gateway para Blazor WebAssembly.
- Kestrel aplicando protección por timeout de headers de request a los trailer headers fragmentados de HTTP/2 y HTTP/3.
- Generación de OpenAPI más precisa para parámetros enum, IDs de schema de arrays y múltiples tipos de contenido de respuesta.
EF Core 11: apps basadas en archivos, mejores warnings y SQL Server 2022 por defecto
EF Core 11 Preview 5 extiende dotnet ef a las apps basadas en archivos:
dotnet ef migrations add InitialCreate --file .\App.csEl scaffolding también soporta --file y --startup-file, lo que hace que EF encaje mejor en el nuevo flujo de C# de un solo archivo.
También hay soporte para .config/dotnet-ef.json, así los comandos EF repetidos pueden compartir opciones por defecto sin líneas de comando largas.
El nuevo warning del analizador EF1004 es uno bueno: avisa cuando se usa ToAsyncEnumerable() sobre un IQueryable<T> de una forma que puede ejecutarse de manera síncrona. Para queries de EF, AsAsyncEnumerable() es el camino más seguro.
El nivel de compatibilidad 160 de SQL Server 2022 ahora es el valor por defecto del provider de SQL Server. Eso habilita nuevas traducciones de SQL por defecto, pero también es algo a revisar antes de actualizar si tu base de datos corre en un nivel de compatibilidad más viejo.
El C# generado por EF Core ahora usa namespaces file-scoped para migraciones, snapshots, modelos compilados y código de reverse-engineering. Código generado más limpio siempre se agradece.
Qué vigilaría antes de adoptarlo
Esto sigue siendo un preview. No lo pondría en producción a ciegas, sobre todo las features del lenguaje C#. Las jerarquías cerradas y las uniones son emocionantes, pero las release notes muestran explícitamente atributos de soporte del compilador y advertencias de preview. Tratá la sintaxis y las reglas como piezas en movimiento hasta previews posteriores o builds RC.
Para bases de código en producción, lo más seguro para experimentar primero es:
- LINQ
FullJoinen código de reconciliación de datos. - Serialización JSON Lines para escenarios de streaming/exportación.
- Chequeos de vulnerabilidad/EOL del SDK en CI.
- Mejoras de validación de Blazor SSR en formularios no críticos.
- Tooling de EF Core basado en archivos en prototipos o herramientas internas.
En resumen
.NET 11 Preview 5 es más que un preview de mantenimiento. Apunta a una plataforma que se está volviendo más expresiva, más scriptable y más amigable con los agentes.
El titular para mí es C# avanzando hacia uniones y jerarquías cerradas de primera clase. Las victorias prácticas del día a día son LINQ FullJoin, el soporte de JSON Lines, los chequeos más fuertes del SDK, un mejor Blazor SSR, y tooling de EF que funciona con apps basadas en archivos.
Si construís sistemas backend, herramientas de desarrollo, servicios cloud o apps Blazor, vale la pena probar este preview en un sandbox.
Fuentes
- Blog de .NET de Microsoft: .NET 11 Preview 5 is now available
- Release notes oficiales: .NET 11 Preview 5
- Release notes de C#: C# in .NET 11 Preview 5
- Release notes de librerías: .NET Libraries in .NET 11 Preview 5
- Release notes de ASP.NET Core: ASP.NET Core in .NET 11 Preview 5
- Release notes de EF Core: Entity Framework Core in .NET 11 Preview 5