Compartir a través de


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, IoT y en la nube. Además de esta unificación, el ecosistema de .NET 6 ofrece:

  • Desarrollo simplificado: Empezar es fácil. Las nuevas características de lenguaje en C# 10 reducen la cantidad de código que necesita escribir. Las inversiones en la pila web y las API mínimas facilitan la escritura rápida de microservicios más pequeños y 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.

  • Máxima productividad: .NET 6 y Visual Studio 2022 proporcionan recarga en caliente, nuevas herramientas de Git, edición de código inteligente, herramientas sólidas de diagnóstico y pruebas, 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 vista previa (GB) 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 nuevo RequiresPreviewFeaturesAttribute se usa para anotar las API en versión preliminar y un analizador correspondiente le avisa si usa estas API en versión preliminar.

.NET 6 es compatible con Visual Studio 2022 y versiones posteriores.

En este artículo no se tratan todas las nuevas características de .NET 6. Para ver todas las nuevas características y obtener más información sobre las características enumeradas en este artículo, consulte 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, consulte la entrada del blog "Mejoras de rendimiento en .NET 6" .

FileStream

El tipo de System.IO.FileStream se ha reescrito para .NET 6 para proporcionar un mejor rendimiento y confiabilidad en Windows. Ahora, FileStream nunca se bloquea cuando se crea para realizar operaciones de 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. El PGO dinámico funciona de la mano con la compilación en capas para optimizar aún más el código en función de la instrumentación adicional que se ha implementado en el nivel 0. PGO dinámico está deshabilitado de forma predeterminada, pero puede habilitarlo con la variable de entorno DOTNET_TieredPGO. Para obtener más información, vea Mejoras de rendimiento de JIT.

Crossgen2

.NET 6 presenta Crossgen2, el sucesor de Crossgen, que se ha eliminado. Crossgen y Crossgen2 son herramientas que proporcionan una compilación anticipada (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 no eran posibles con la versión anterior. Para obtener más información, vea Conversation about Crossgen2.

Compatibilidad con Arm64

La versión de .NET 6 incluye compatibilidad con sistemas operativos macOS Arm64 (o "Apple Silicon") y Windows Arm64, tanto para la ejecución nativa de Arm64 como para la emulación x64 nativa. 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 en caliente es una característica que permite modificar el código fuente de la aplicación y aplicar de forma instantánea esos cambios a la aplicación en ejecución. El propósito de la característica es aumentar la productividad evitando los reinicios de la aplicación entre ediciones. La recarga en caliente está disponible en Visual Studio 2022 y la herramienta de línea de comandos dotnet watch. La recarga activa funciona con la mayoría de los tipos de aplicaciones .NET y para el 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, consulte la entrada de blog Update on .NET Multi-platform App UI .

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 historial de versiones del lenguaje C#.

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

  • método async Main
  • Declaraciones de nivel superior
  • Expresiones nuevas con tipo de destino
  • Directivas global using implícitas
  • Espacios de nombres con ámbito de archivo
  • Tipos de referencia anulables

Al agregar estas nuevas características de lenguaje a las plantillas de proyecto, el código nuevo comienza con las características habilitadas. Sin embargo, el código existente no se ve afectado al actualizar a .NET 6. Para obtener más información sobre estos cambios de plantilla, consulte 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# Interactive. 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 el tamaño del SDK de .NET más pequeño, algunos componentes se han colocado en cargas de trabajo nuevas, opcionales SDK. 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 mediante los nuevos comandos de dotnet workload:

Get-Help Descripción
dotnet workload search Busca 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 interrumpida.
dotnet workload list Enumera las cargas de trabajo instaladas.

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

APIs 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 código fuente

.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, consulte Cómo elegir la reflexión o la generación de origen en system.Text.Json y Cómo usar la generación de origen en System.Text.Json.

DOM que admite escritura

Se ha agregado un nuevo modelo de objetos de documento que se puede escribir (DOM), que complementa el DOM de solo lectura existente. La nueva API ofrece una alternativa de serialización ligera para los casos en los que no es posible usar tipos de objeto CLR comunes antiguos (POCO). También permite navegar de forma eficaz 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 se puede escribir:

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ónica enumeran las instancias de IAsyncEnumerable<T> en un gráfico de objetos y, a continuación, las serializan como matrices JSON. Para la deserialización, se agregó el nuevo método JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken). Para obtener más información, consulte la serialización de IAsyncEnumerable .

Otras API nuevas

Nuevas interfaces de serialización 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 "raw":

Serialización y deserialización sincrónicas en un flujo

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 cómo serializar y deserializar con System.Text.Json, consulte serialización y deserialización de JSON en .NET.

HTTP/3

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

ASP.NET Core

ASP.NET Core incluye mejoras en las API mínimas, la compilación anticipada (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, consulte 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 le ayudan a 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 instrumento para admitir diferentes escenarios de métricas. Las clases de instrumento son:

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 Intel disponible en algunos procesadores Intel y AMD más recientes. Agrega funcionalidades al hardware que protegen contra algunos ataques de secuestro de flujo de control. .NET 6 proporciona compatibilidad con CET para aplicaciones de Windows x64 y debe habilitarla 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 forma 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 escribibles y ejecutables 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 también incorpora la eliminación de tipos y miembros no utilizados. Además, las advertencias de recorte, que le advierten sobre lugares en los que el recorte puede eliminar código que se usa en tiempo de ejecución, ahora están habilitadas de forma 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), consulte Analyzer releases - .NET 6.

Protectores de plataformas personalizados

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 protección de plataformas personalizadas, .NET 6 presenta dos atributos nuevos que puede usar para anotar campos, propiedades o métodos con un nombre de plataforma admitido o no compatible:

Windows Forms

Application.SetDefaultFont(Font) es un nuevo método en .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 aplicación, que reduce el código reutilizable y permite al diseñador de Windows Forms representar la superficie de diseño en la fuente preferida. El código bootstrap es una llamada a ApplicationConfiguration.Initialize(), que es un método generado por el código fuente que emite llamadas a otros métodos de configuración, como Application.EnableVisualStyles(). Además, si configuras una fuente no predeterminada a través de la propiedad ApplicationDefaultFont MSBuild, ApplicationConfiguration.Initialize() emite una llamada a SetDefaultFont(Font).

Para obtener más información, consulte la publicación del blog Novedades en Windows Forms.

Compilación de origen

El archivo tar de código fuente, que contiene todo el código fuente del SDK de .NET, ahora es un producto de la compilación del SDK de .NET. Otras organizaciones, como Red Hat, pueden crear 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, consulte la entrada de blog "Matemáticas genéricas".

Validación de paquetes NuGet

Si es desarrollador de la biblioteca NuGet, las nuevas herramientas de validación de paquetes permiten validar que los paquetes son coherentes y bien formados. Puede determinar si:

  • Que haya cambios importantes en las versiones del paquete.
  • El paquete tiene el mismo conjunto de API públicas para todas las implementaciones específicas del entorno de ejecución.
  • Hay 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.

APIs 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.

Namespace 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 nuevos métodos de ConfigureHostOptions simplifican la configuración de la aplicación.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging tiene un nuevo generador de código para API de registro de alto 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 suele ser 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.

Nuevas API de LINQ

Se han agregado numerosos métodos LINQ en .NET 6. La mayoría de los nuevos métodos enumerados 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 teclas.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectByy Enumerable.UnionBy Estas nuevas variaciones de métodos que realizan operaciones basadas en conjuntos permiten especificar la igualdad mediante una función del selector de claves.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) y Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Acepta índices contados 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 nuevas sobrecargas 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 de 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 fecha y la parte de hora de un DateTime, respectivamente. DateOnly es útil para cumpleaños y aniversarios, y TimeOnly es útil para alarmas diarias y horas laborables semanales.

Ahora puede usar los identificadores de zona horaria de la Autoridad de Números Asignados de Internet (IANA) o de Windows en cualquier sistema operativo que tenga datos de zona horaria instalados. 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 nuevos métodos TryConvertIanaIdToWindowsId(String, String) y TryConvertWindowsIdToIanaId se han agregado para escenarios en los que todavía es necesario convertir manualmente de un formato de zona horaria a otro.

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

Clase PriorityQueue

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

Consulte también