Novedades de .NET 6

.NET 6 ofrece las partes finales del plan de unificación de .NET que se inició con .NET 5. .NET 6 unifica el SDK, las bibliotecas base y el entorno de ejecución en aplicaciones móviles, de escritorio, de IoT y en la nube. Además de esta unificación, el ecosistema de .NET 6 ofrece lo siguiente:

  • Desarrollo simplificado: la introducción es sencilla. Las características nuevas del lenguaje en C# 10 reducen la cantidad de código que necesita escribir. Además, las inversiones en la pila web y las API mínimas hacen que sea fácil escribir rápidamente microservicios más pequeños y más rápidos.

  • Mejor rendimiento: .NET 6 es el marco web de pila completa más rápido, lo que reduce los costos de proceso si se ejecuta en la nube.

  • Productividad definitiva: .NET 6 y Visual Studio 2022 proporcionan recarga activa, nuevas herramientas de Git, edición de código inteligente, herramientas de diagnóstico y pruebas sólidas, y una mejor colaboración en equipo.

.NET 6 se admitirá durante tres años como versión de soporte técnico a largo plazo (LTS).

Las características en versión preliminar están deshabilitadas de forma predeterminada. Tampoco se admiten para su uso en producción y se pueden quitar en una versión futura. El elemento RequiresPreviewFeaturesAttribute nuevo se usa para anotar las API de versión preliminar y un analizador correspondiente avisa si se están usando estas API de versión preliminar.

.NET 6 es compatible con Visual Studio 2022 y Visual Studio 2022 para Mac (y versiones posteriores).

En este artículo no se cubren todas las características nuevas de .NET 6. Para ver todas las características nuevas y obtener más información sobre las características que se muestran en este artículo, vea la entrada de blog Anuncio de .NET 6.

Rendimiento

.NET 6 incluye numerosas mejoras de rendimiento. En esta sección se enumeran algunas de las mejoras en FilesStream , la optimización guiada por perfiles, y la compilación AOT . Para obtener información detallada, vea la entrada de blog Mejoras de rendimiento en .NET 6.

Secuencia de archivos

El tipo System.IO.FileStream se ha reescrito para .NET 6 a fin de proporcionar un mejor rendimiento y fiabilidad en Windows. Ahora, FileStream nunca se bloquea cuando se crea para E/S asincrónica en Windows. Para obtener más información, consulte la entrada de blog Mejoras de E/S de archivos en .NET 6.

Optimización guiada por perfiles

La Optimización guiada por perfiles (PGO) es donde el compilador JIT genera código optimizado en términos de los tipos y rutas de acceso de código que se usan con más frecuencia. .NET 6 presenta la PGO dinámica. La PGO dinámica funciona de la mano con la compilación en niveles para optimizar aún más el código en función de la instrumentación adicional que se pone en marcha durante el nivel 0. La PGO dinámica está deshabilitada de manera predeterminada, pero se puede habilitar con la DOTNET_TieredPGOvariable de entorno. Para obtener más información, vea Mejoras de rendimiento de JIT.

Crossgen2

.NET 6 presenta Crossgen2, el sucesor de Crossgen, que se ha quitado. Crossgen y Crossgen2 son herramientas que proporcionan compilación Ahead Of Time (AOT) para mejorar el tiempo de inicio de una aplicación. Crossgen2 está escrito en C# en lugar de C++, y puede realizar análisis y optimización que con la versión anterior no eran posibles. Para obtener más información, vea Conversación sobre Crossgen2.

Compatibilidad con Arm64

La versión de .NET 6 incluye compatibilidad con macOS Arm64 (o "Apple Silicon") y sistemas operativos Windows Arm64, tanto para la ejecución nativa de Arm64 como para la emulación de x64. Además, los instaladores de .NET x64 y Arm64 ahora se instalan en paralelo. Para obtener más información, vea Compatibilidad de .NET con macOS 11 y Windows 11 para Arm64 y x64.

Recarga activa

Recarga activa es una característica que permite modificar el código fuente de la aplicación y aplicar al instante esos cambios a la aplicación en ejecución. El propósito de la característica es aumentar la productividad evitando los reinicios de aplicaciones entre ediciones. Recarga activa está disponible en Visual Studio 2022 y la herramienta de la línea de comandos dotnet watch. Recarga activa funciona con la mayoría de los tipos de aplicaciones .NET y para código fuente de C#, Visual Basic y C++. Para obtener más información, vea la entrada de blog Recarga activa.

.NET MAUI

La interfaz de usuario de la aplicación multiplataforma de .NET (.NET MAUI) todavía está en versión preliminar, con una versión candidata para lanzamiento en el primer trimestre de 2022 y disponibilidad general (GA) en el segundo trimestre de 2022. .NET MAUI permite compilar aplicaciones cliente nativas para sistemas operativos móviles y de escritorio con un único código base. Para obtener más información, vea la entrada de blog Actualización de la interfaz de usuario de aplicaciones multiplataforma de .NET.

C# 10 y plantillas

C# 10 incluye innovaciones, tales como directivas global using, declaraciones de espacio de nombres con ámbito de archivo y estructuras de registro. Para obtener más información, vea Novedades de C# 10.

En colaboración con ese trabajo, las plantillas de proyecto del SDK de .NET para C# se han modernizado para usar algunas de las características del lenguaje nuevas:

  • Método async Main
  • Instrucciones de nivel superior
  • Expresiones nuevas con tipo de destino
  • Directivas global using implícitas
  • Espacios de nombres con ámbito de archivo
  • Tipos de referencia que aceptan valores NULL

Al agregar estas características de lenguaje nuevas a las plantillas de proyecto, el código nuevo comienza con las características habilitadas. Pero el código existente no se ve afectado al actualizar a .NET 6. Para obtener más información sobre estos cambios de plantilla, vea la entrada de blog SDK de .NET: Plantillas de proyecto de C# modernizadas.

F# y Visual Basic

F# 6 agrega varias mejoras al lenguaje F# y a F# interactivo. Para obtener más información, vea Novedades de F# 6.

Visual Basic tiene mejoras en la experiencia de Visual Studio y el inicio del proyecto de Windows Forms.

Cargas de trabajo del SDK

Para mantener más pequeño el tamaño del SDK de .NET, algunos componentes se han colocado en cargas de trabajo del SDK nuevas y opcionales. Estos componentes incluyen .NET MAUI y Blazor WebAssembly AOT. Si usa Visual Studio, se encargará de instalar las cargas de trabajo del SDK que necesite. Si usa la CLI de .NET, puede administrar cargas de trabajo con los comandos dotnet workload nuevos:

Get-Help Descripción
dotnet workload search Busca las cargas de trabajo disponibles.
dotnet workload install Instala una carga de trabajo especificada.
dotnet workload uninstall Quita una carga de trabajo especificada.
dotnet workload update Actualiza las cargas de trabajo instaladas.
dotnet workload repair Vuelve a instalar todas las cargas de trabajo instaladas para reparar una instalación rota.
dotnet workload list Muestra las cargas de trabajo instaladas.

Para obtener más información, vea Cargas de trabajo opcionales del SDK.

API de System.Text.Json

Se han realizado muchas mejoras en System.Text.Json en .NET 6, de forma que ahora es una solución de serialización de "de nivel industrial".

Generador de origen

.NET 6 agrega un generador de origen nuevo para System.Text.Json. La generación de origen funciona con JsonSerializer y se puede configurar de varias maneras. Puede mejorar el rendimiento, reducir el uso de memoria y facilitar el recorte de ensamblados. Para obtener más información, vea Procedimientos para elegir la reflexión o la generación de origen en System.Text.Json y Procedimientos para usar la generación de origen en System.Text.Json.

DOM que admite escritura

Se ha agregado un modelo de objetos de documento (DOM) nuevo que admite escritura, que complementa el DOM de solo lectura existente previamente. La API nueva proporciona una alternativa de serialización ligera para los casos en los que no es posible el uso de tipos de objetos CLR estándar (POCO). También permite navegar eficazmente a una subsección de un árbol JSON grande y leer una matriz o deserializar un POCO desde esa subsección. Se han agregado los siguientes tipos nuevos para admitir el DOM que admite escritura:

Para obtener más información, vea Opciones de DOM de JSON.

Serialización IAsyncEnumerable

System.Text.Json ahora admite la serialización y deserialización con instancias de IAsyncEnumerable<T>. Los métodos de serialización asincrónicos enumeran todas las instancias de IAsyncEnumerable<T> en un gráfico de objetos y, después, las serializan como matrices JSON. Para la deserialización, se agregó el método JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) nuevo. Para obtener más información, vea Serialización de IAsyncEnumerable.

Otras API nuevas

Interfaces de serialización nuevas para la validación y los valores predeterminados:

Para obtener más información, vea Devoluciones de llamada.

Nuevo atributo de ordenación de propiedades:

Nuevo método para escribir JSON "sin formato":

Serialización y deserialización sincrónica en una secuencia:

Nueva opción para omitir un objeto cuando se detecta un ciclo de referencia durante la serialización:

Para obtener más información sobre la serialización y la deserialización con System.Text.Json, vea Serialización y deserialización en .NET.

HTTP/3

.NET 6 incluye compatibilidad en versión preliminar con HTTP/3, una versión nueva de HTTP. HTTP/3 resuelve algunos desafíos funcionales y de rendimiento existentes mediante un protocolo nuevo de conexión subyacente denominado QUIC. QUIC establece las conexiones con mayor rapidez y las conexiones son independientes de la dirección IP, lo que permite a los clientes móviles moverse entre redes Wi-Fi y de telefonía móvil. Para obtener más información, vea Uso de HTTP/3 con HttpClient.

ASP.NET Core

ASP.NET Core incluye mejoras en las API mínimas, la compilación Ahead Of Time (AOT) para aplicaciones WebAssembly de Blazor y aplicaciones de página única. Además, los componentes de Blazor ahora se pueden representar desde JavaScript e integrarse con aplicaciones basadas en JavaScript existentes. Para obtener más información, vea Novedades de ASP.NET Core 6.

OpenTelemetry

.NET 6 ofrece compatibilidad mejorada con OpenTelemetry, que es una colección de herramientas, API y SDK que permiten analizar el rendimiento y el comportamiento del software. Las API del espacio de nombres System.Diagnostics.Metrics implementan la especificación de la API de métricas de OpenTelemetry. Por ejemplo, hay cuatro clases de instrumentos para admitir diferentes escenarios de métricas. Las clases de instrumentos son las siguientes:

Seguridad

.NET 6 agrega compatibilidad en versión preliminar con dos mitigaciones de seguridad clave: Tecnología de aplicación de flujos de control (CET) y "ejecución exclusiva de escritura" (W^X).

CET es una tecnología de Intel disponible en algunos procesadores Intel y AMD más recientes. Agrega capacidades al hardware que protegen contra algunos ataques de secuestro de flujo de control. .NET 6 proporciona compatibilidad con CET para aplicaciones Windows x64 y se debe habilitar explícitamente. Para obtener más información, vea Compatibilidad de .NET 6 con las pilas de sombras de Intel CET.

W^X está disponible en todos los sistemas operativos con .NET 6, pero solo está habilitado de manera predeterminada en Apple Silicon. W^X bloquea la ruta de acceso de ataque más sencilla al no permitir que las páginas de memoria sean ejecutables y admitan escritura al mismo tiempo.

Recorte de IL

Se ha mejorado el recorte de implementaciones independientes. En .NET 5, solo se recortaban los ensamblados sin usar. .NET 6 agrega también el recorte de tipos y miembros sin usar. Además, las advertencias de recorte, que alertan de los lugares donde el recorte puede quitar el código que se usa en tiempo de ejecución, ahora están habilitadas de manera predeterminada. Para obtener más información, vea Recorte de implementaciones autocontenidas y ejecutables.

Análisis de código

El SDK de .NET 6 incluye una serie de analizadores de código nuevos que afectan a la compatibilidad de API, la compatibilidad de la plataforma, la seguridad de recorte, el uso del intervalo en la concatenación y división de cadenas, las API de cadena más rápidas y las API de colección más rápidas. Para obtener una lista completa de los analizadores nuevos (y eliminados), vea Versiones del analizador: .NET 6.

Restricciones de plataforma personalizada

El Analizador de compatibilidad de plataformas reconoce los métodos Is<Platform> en la clase OperatingSystem, por ejemplo, OperatingSystem.IsWindows(), como restricciones de la plataforma. Para permitir las restricciones de plataforma personalizada, .NET 6 presenta dos atributos nuevos que se pueden usar para anotar campos, propiedades o métodos con un nombre de plataforma compatible o no compatible:

Windows Forms

Application.SetDefaultFont(Font) es un método nuevo de .NET 6 que establece la fuente predeterminada en la aplicación.

Las plantillas para las aplicaciones de Windows Forms en C# se han actualizado para admitir directivas global using, espacios de nombres con ámbito de archivo y tipos de referencia que aceptan valores NULL. Además, incluyen código de arranque de la aplicación, que reduce el código reutilizable y permite que el diseñador de Windows Forms represente la superficie de diseño en la fuente preferida. El código de arranque es una llamada a ApplicationConfiguration.Initialize(), que es un método generado por el origen que emite llamadas a otros métodos de configuración, como Application.EnableVisualStyles(). Además, si establece una fuente no predeterminada mediante la propiedad de MSBuild ApplicationDefaultFont, ApplicationConfiguration.Initialize() emite una llamada a SetDefaultFont(Font).

Para obtener más información, vea la entrada de blog Novedades de Windows Forms.

Compilación de origen

El tarball de origen, que contiene todo el origen del SDK de .NET, es ahora un producto de la compilación del SDK de .NET. Otras organizaciones, como Red Hat, pueden compilar su propia versión del SDK mediante este tarball de origen.

Monikers de la plataforma de destino

Se han agregado monikers de la plataforma de destino (TFM) adicionales específicos del sistema operativo para .NET 6 como, por ejemplo, net6.0-android, net6.0-ios y net6.0-macos. Para obtener más información, vea TFM específicos del sistema operativo de .NET 5 y versiones posteriores.

Matemáticas genéricas

La capacidad de usar operadores en tipos genéricos en .NET 6 está en versión preliminar. .NET 6 presenta numerosas interfaces que emplean la nueva característica en vista previa de C# 10, los miembros de la interfaz static abstract. Estas interfaces corresponden a operadores diferentes, por ejemplo, IAdditionOperators representa el operador +. Las interfaces están disponibles en el paquete NuGet System.Runtime.Experimental. Para obtener más información, vea la entrada de blog Matemáticas genéricas.

Validación de paquetes NuGet

Si es un desarrollador de bibliotecas de NuGet, las herramientas de validación de paquetes nuevas le permiten validar que los paquetes son coherentes y están bien formados. Puede determinar lo siguiente:

  • Que haya cambios importantes en las versiones del paquete.
  • Que el paquete tenga el mismo conjunto de API públicas para todas las implementaciones específicas del entorno de ejecución.
  • Que existan lagunas para la aplicabilidad de la plataforma de destino o del entorno de ejecución.

Para obtener más información, vea la entrada de blog Validación de paquetes.

API de reflexión

.NET 6 presenta las siguientes API nuevas que inspeccionan el código y proporcionan información de nulabilidad:

Estas API son útiles para herramientas y serializadores basados en reflexión.

API de Microsoft.Extensions

Varios espacios de nombres de extensiones tienen mejoras en .NET 6, tal como se muestra en la tabla siguiente.

Espacio de nombres Mejoras
Microsoft.Extensions.DependencyInjection CreateAsyncScope permite usar de forma segura una instrucción using para un proveedor de servicios que registra un servicio IAsyncDisposable.
Microsoft.Extensions.Hosting Los métodos ConfigureHostOptions nuevos simplifican la configuración de la aplicación.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging tiene un generador de origen nuevo para las API de registro de rendimiento. El generador de origen se desencadena si se agrega el elemento LoggerMessageAttribute nuevo a un método de registro partial. En tiempo de compilación, el generador genera la implementación del método partial, que normalmente es más rápido en tiempo de ejecución que las soluciones de registro existentes. Para obtener más información, vea Generación de origen de registro en tiempo de compilación.

API de LINQ nuevas

Se han agregado numerosos métodos LINQ en .NET 6. La mayoría de los métodos nuevos que se muestran en la tabla siguiente tienen métodos equivalentes en el tipo System.Linq.Queryable.

Método Descripción
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Intenta determinar el número de elementos de una secuencia sin forzar una enumeración.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Divide los elementos de una secuencia en fragmentos de un tamaño especificado.
Enumerable.MaxBy y Enumerable.MinBy Busca elementos máximos o mínimos mediante un selector de claves.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectBy y Enumerable.UnionBy. Estas variaciones nuevas de los métodos que realizan operaciones basadas en conjunto permiten especificar la igualdad mediante una función de selector de claves.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) y Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Acepta índices que se cuentan desde el principio o el final de la secuencia, por ejemplo, Enumerable.Range(1, 10).ElementAt(^2)devuelve 9.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) y Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) y Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) y Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Las sobrecargas nuevas permiten especificar un valor predeterminado que se usará si la secuencia está vacía.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) y Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) Las sobrecargas nuevas permiten especificar un comparador.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Acepta un argumento Range para simplificar la toma de un segmento de una secuencia, por ejemplo, puede usar source.Take(2..7) en lugar de source.Take(7).Skip(2).
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) Genera una secuencia de tuplas con elementos a partir de tres secuencias especificadas.

Mejoras de fecha, hora y zona horaria

Las dos estructuras siguientes se agregaron en .NET 6: System.DateOnly y System.TimeOnly. Representan la parte de la fecha y la parte de la hora de un elemento DateTime, respectivamente. DateOnly es útil para los cumpleaños y aniversarios, y TimeOnly es útil para las alarmas diarias y el horario comercial semanal.

Ahora puede usar Internet Assigned Numbers Authority (IANA) o los id. de zona horaria de Windows en cualquier sistema operativo que tenga instalados datos de zona horaria. El método TimeZoneInfo.FindSystemTimeZoneById(String) se ha actualizado para convertir automáticamente su entrada de una zona horaria de Windows a una zona horaria de IANA (o viceversa) si la zona horaria solicitada no se encuentra en el sistema. Además, los métodos nuevos TryConvertIanaIdToWindowsId(String, String) y TryConvertWindowsIdToIanaId se han agregado para escenarios en los que todavía necesita convertir manualmente de un formato de zona horaria a otro.

También hay algunas otras mejoras de zona horaria. Para obtener más información, vea Mejoras de fecha, hora y zona horaria en .NET 6.

Clase PriorityQueue

La clase nueva PriorityQueue<TElement,TPriority> representa una colección de elementos que tienen un valor y una prioridad. Los elementos se quitan de la cola en orden de prioridad creciente, es decir, el elemento con el valor de prioridad más bajo se quita de la cola en primer lugar. Esta clase implementa una estructura de datos de montón mínima.

Vea también