Novidades do .NET 6

O .NET 6 fornece as partes finais do plano de unificação do .NET que começou com o .NET 5. O .NET 6 unifica o SDK, as bibliotecas base e o tempo de execução em aplicativos móveis, de desktop, IoT e na nuvem. Além dessa unificação, o ecossistema .NET 6 oferece:

  • Desenvolvimento simplificado: Começar é fácil. Novos recursos de linguagem em C# 10 reduzem a quantidade de código que você precisa escrever. E os investimentos na pilha da Web e APIs mínimas facilitam a escrita rápida de microsserviços menores e mais rápidos.

  • Melhor desempenho: o .NET 6 é a estrutura da Web full stack mais rápida, o que reduz os custos de computação se você estiver executando na nuvem.

  • Produtividade máxima: o .NET 6 e o Visual Studio 2022 fornecem recarga a quente, novas ferramentas git, edição de código inteligente, ferramentas robustas de diagnóstico e teste e melhor colaboração em equipe.

O .NET 6 terá suporte por três anos como uma versão de suporte de longo prazo (LTS).

As funcionalidades de pré-visualização estão desativadas por predefinição. Eles também não são suportados para uso em produção e podem ser removidos em uma versão futura. O novo RequiresPreviewFeaturesAttribute é usado para anotar APIs de visualização, e um analisador correspondente alerta se você estiver usando essas APIs de visualização.

O .NET 6 é suportado pelo Visual Studio 2022 e pelo Visual Studio 2022 para Mac (e versões posteriores).

Este artigo não abrange todos os novos recursos do .NET 6. Para ver todos os novos recursos e para obter mais informações sobre os recursos listados neste artigo, consulte a postagem do blog Anunciando o .NET 6 .

Desempenho

O .NET 6 inclui várias melhorias de desempenho. Esta seção lista algumas das melhorias — no FileStream, otimização guiada por perfil e compilação AOT. Para obter informações detalhadas, consulte a postagem do blog Melhorias de desempenho no .NET 6 .

FileStream

O System.IO.FileStream tipo foi reescrito para .NET 6 para fornecer melhor desempenho e confiabilidade no Windows. Agora, FileStream nunca bloqueie quando criado para E/S assíncrona no Windows. Para obter mais informações, consulte a postagem do blog File IO improvements in .NET 6 .

Otimização guiada por perfil

A otimização guiada por perfil (PGO) é onde o compilador JIT gera código otimizado em termos dos tipos e caminhos de código usados com mais frequência. O .NET 6 introduz o PGO dinâmico . O PGO dinâmico trabalha lado a lado com a compilação hierárquica para otimizar ainda mais o código com base na instrumentação adicional implementada durante a camada 0. O PGO dinâmico está desativado por padrão, mas você pode habilitá-lo com a DOTNET_TieredPGOvariável de ambiente. Para obter mais informações, consulte Melhorias de desempenho JIT.

Crossgen2

O .NET 6 apresenta o Crossgen2, o sucessor do Crossgen, que foi removido. Crossgen e Crossgen2 são ferramentas que fornecem compilação antecipada (AOT) para melhorar o tempo de inicialização de um aplicativo. O Crossgen2 é escrito em C# em vez de C++, e pode realizar análises e otimizações que não eram possíveis com a versão anterior. Para obter mais informações, consulte Conversa sobre Crossgen2.

Suporte Arm64

A versão .NET 6 inclui suporte para os sistemas operacionais macOS Arm64 (ou "Apple Silicon") e Windows Arm64, para execução nativa do Arm64 e emulação x64. Além disso, os instaladores x64 e Arm64 .NET agora são instalados lado a lado. Para obter mais informações, consulte Suporte .NET para macOS 11 e Windows 11 para Arm64 e x64.

Recarga a quente

A recarga ativa é um recurso que permite modificar o código-fonte do aplicativo e aplicar instantaneamente essas alterações ao aplicativo em execução. O objetivo do recurso é aumentar sua produtividade, evitando reinicializações de aplicativos entre as edições. A recarga ativa está disponível no Visual Studio 2022 e na ferramenta de dotnet watch linha de comando. A recarga a quente funciona com a maioria dos tipos de aplicativos .NET e para código-fonte C#, Visual Basic e C++. Para obter mais informações, consulte a postagem do blog Hot reload.

.NET MAUI

O .NET Multi-platform App UI (.NET MAUI) ainda está em pré-visualização, com um candidato a lançamento no primeiro trimestre de 2022 e disponibilidade geral (GA) no segundo trimestre de 2022. O .NET MAUI torna possível criar aplicativos cliente nativos para sistemas operacionais móveis e de desktop com uma única base de código. Para obter mais informações, consulte a postagem do blog Update on .NET Multi-platform App UI .

C# 10 e modelos

O C# 10 inclui inovações como global using diretivas, declarações de namespace com escopo de arquivo e estruturas de registro. Para obter mais informações, consulte Novidades no C# 10.

Em conjunto com esse trabalho, os modelos de projeto do SDK do .NET para C# foram modernizados para usar alguns dos novos recursos de linguagem:

  • async Main método
  • Declarações de nível superior
  • Novas expressões de tipo de destino
  • Diretivas implícitas global using
  • Namespaces com escopo de arquivo
  • Tipos de referência anuláveis

Ao adicionar esses novos recursos de linguagem aos modelos de projeto, o novo código começa com os recursos habilitados. No entanto, o código existente não é afetado quando você atualiza para o .NET 6. Para obter mais informações sobre essas alterações de modelo, consulte a postagem de blog modernizada do .NET SDK: C# project templates .

F# e Visual Basic

O F# 6 adiciona várias melhorias à linguagem F# e ao F# interativo. Para obter mais informações, consulte Novidades no F# 6.

Visual Basic tem melhorias na experiência do Visual Studio e inicialização do projeto Windows Forms.

Cargas de trabalho do SDK

Para manter o tamanho do SDK do .NET menor, alguns componentes foram colocados em novas cargas de trabalho opcionais do SDK. Esses componentes incluem .NET MAUI e Blazor WebAssembly AOT. Se você usar o Visual Studio, ele cuidará da instalação de quaisquer cargas de trabalho do SDK necessárias. Se você usar a CLI do .NET, poderá gerenciar cargas de trabalho usando os novos dotnet workload comandos:

Comando Description
Pesquisa de carga de trabalho dotnet Procura cargas de trabalho disponíveis.
instalação da carga de trabalho dotnet Instala uma carga de trabalho especificada.
desinstalação da carga de trabalho dotnet Remove uma carga de trabalho especificada.
Atualização da carga de trabalho dotnet Atualiza as cargas de trabalho instaladas.
Reparo da carga de trabalho dotnet Reinstala todas as cargas de trabalho instaladas para reparar uma instalação interrompida.
Lista de carga de trabalho dotnet Lista as cargas de trabalho instaladas.

Para obter mais informações, consulte Cargas de trabalho SDK opcionais.

System.Text.Json APIs

Muitas melhorias foram feitas no System.Text.Json .NET 6, de modo que agora é uma solução de serialização de "força industrial".

Gerador de fonte

O .NET 6 adiciona um novo gerador de origem para System.Text.Jsono . A geração de origem funciona e JsonSerializer pode ser configurada de várias maneiras. Ele pode melhorar o desempenho, reduzir o uso de memória e facilitar o corte da montagem. Para obter mais informações, consulte Como escolher reflexão ou geração de origem em System.Text.Json e Como usar a geração de origem em System.Text.Json.

DOM gravável

Um novo DOM (Document Object Model) gravável foi adicionado, que complementa o DOM somente leitura pré-existente. A nova API fornece uma alternativa de serialização leve para casos em que o uso de tipos de objeto CLR antigo (POCO) simples não é possível. Ele também permite que você navegue com eficiência até uma subseção de uma grande árvore JSON e leia uma matriz ou desserialize um POCO dessa subseção. Os seguintes novos tipos foram adicionados para suportar o DOM gravável:

Para obter mais informações, consulte Opções de DOM JSON.

Serialização IAsyncEnumerable

System.Text.Json agora suporta serialização e desserialização com IAsyncEnumerable<T> instâncias. Os métodos de serialização assíncrona enumeram quaisquer IAsyncEnumerable<T> instâncias em um gráfico de objeto e, em seguida, serializam-nas como matrizes JSON. Para desserialização, o novo método JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) foi adicionado. Para obter mais informações, consulte IAsyncEnumerable serialization.

Outras novas APIs

Novas interfaces de serialização para validação e valores padrão:

Para obter mais informações, consulte Retornos de chamada.

Novo atributo de ordenação de propriedade:

Novo método para escrever JSON "bruto":

Serialização e desserialização síncronas para um fluxo:

Nova opção para ignorar um objeto quando um ciclo de referência é detetado durante a serialização:

Para obter mais informações sobre serialização e desserialização com System.Text.Jsono , consulte Serialização e desserialização JSON no .NET.

HTTP/3

O .NET 6 inclui suporte de visualização para HTTP/3, uma nova versão do HTTP. HTTP/3 resolve alguns desafios funcionais e de desempenho existentes usando um novo protocolo de conexão subjacente chamado QUIC. O QUIC estabelece conexões mais rapidamente, e as conexões são independentes do endereço IP, permitindo que os clientes móveis circulem entre redes Wi-fi e celulares. Para obter mais informações, consulte Usar HTTP/3 com HttpClient.

ASP.NET Core

ASP.NET Core inclui melhorias em APIs mínimas, compilação antecipada (AOT) para aplicativos Blazor WebAssembly e aplicativos de página única. Além disso, os componentes Blazor agora podem ser renderizados a partir de JavaScript e integrados com aplicativos baseados em JavaScript existentes. Para obter mais informações, consulte Novidades no ASP.NET Core 6.

OpenTelemetry

O .NET 6 oferece suporte aprimorado para OpenTelemetry, que é uma coleção de ferramentas, APIs e SDKs que ajudam você a analisar o desempenho e o comportamento do seu software. As APIs no System.Diagnostics.Metrics namespace implementam a especificação da API OpenTelemetry Metrics. Por exemplo, há quatro classes de instrumentos para dar suporte a diferentes cenários de métricas. As classes de instrumentos são:

Segurança

O .NET 6 adiciona suporte de visualização para duas atenuações de segurança importantes: CET (Control-flow Enforcement Technology) e "write exclusive execute" (W^X).

CET é uma tecnologia Intel disponível em alguns processadores Intel e AMD mais recentes. Ele adiciona recursos ao hardware que protegem contra alguns ataques de sequestro de fluxo de controle. O .NET 6 fornece suporte para CET para aplicativos x64 do Windows e você deve habilitá-lo explicitamente. Para obter mais informações, consulte Compatibilidade do .NET 6 com pilhas de sombra Intel CET.

W^X está disponível em todos os sistemas operacionais com .NET 6, mas apenas ativado por padrão no Apple Silicon. W^X bloqueia o caminho de ataque mais simples, impedindo que as páginas de memória sejam graváveis e executáveis ao mesmo tempo.

Corte de IL

O corte de implantações independentes foi melhorado. No .NET 5, apenas assemblies não utilizados foram cortados. O .NET 6 também adiciona o corte de tipos e membros não utilizados. Além disso, os avisos de corte, que alertam para locais onde o corte pode remover o código usado em tempo de execução, agora estão habilitados por padrão. Para obter mais informações, consulte Cortar implantações independentes e executáveis.

Análise de código

O SDK do .NET 6 inclui um punhado de novos analisadores de código que dizem respeito à compatibilidade de API, compatibilidade de plataforma, segurança de corte, uso de span na concatenação e divisão de cadeias de caracteres, APIs de cadeia de caracteres mais rápidas e APIs de coleta mais rápidas. Para obter uma lista completa de analisadores novos (e removidos), consulte Versões do Analyzer - .NET 6.

Protetores de plataforma personalizados

O analisador de compatibilidade de plataforma reconhece os Is<Platform> métodos na classe, por exemplo, OperatingSystem.IsWindows()como protetores de OperatingSystem plataforma. Para permitir proteções de plataforma personalizadas, o .NET 6 apresenta dois novos atributos que você pode usar para anotar campos, propriedades ou métodos com um nome de plataforma com ou sem suporte:

Windows Forms

Application.SetDefaultFont(Font) é um novo método no .NET 6 que define a fonte padrão em todo o seu aplicativo.

Os modelos para aplicativos C# Windows Forms foram atualizados para oferecer suporte global using a diretivas, namespaces com escopo de arquivo e tipos de referência anuláveis. Além disso, eles incluem código de bootstrap do aplicativo, que reduz o código clichê e permite que o designer do Windows Forms renderize a superfície de design na fonte preferida. O código de bootstrap é uma chamada para , que é um método gerado pela ApplicationConfiguration.Initialize()fonte que emite chamadas para outros métodos de configuração, como Application.EnableVisualStyles(). Além disso, se você definir uma fonte não padrão por meio da propriedade ApplicationDefaultFont MSBuild, ApplicationConfiguration.Initialize() emitirá uma chamada para SetDefaultFont(Font).

Para obter mais informações, consulte a postagem do blog Novidades no Windows Forms .

Compilação de origem

O tarball de origem, que contém toda a fonte para o SDK do .NET, agora é um produto da compilação do SDK do .NET. Outras organizações, como a Red Hat, podem criar sua própria versão do SDK usando esse tarball de origem.

Apelidos da estrutura de destino

Foram adicionados monikers (TFMs) adicionais da estrutura de destino específica do SO para o .NET 6, por exemplo, net6.0-android, net6.0-iose net6.0-macos. Para obter mais informações, consulte TFMs específicos do .NET 5+ OS.

Matemática genérica

Na visualização é a capacidade de usar operadores em tipos genéricos no .NET 6. O .NET 6 apresenta várias interfaces que usam o novo recurso de visualização do C# 10, static abstract os membros da interface. Estas interfaces correspondem a diferentes operadores, por exemplo, IAdditionOperators representa o + operador. As interfaces estão disponíveis no pacote NuGet System.Runtime.Experimental . Para obter mais informações, consulte a postagem do blog Matemática genérica.

Validação do pacote NuGet

Se você for um desenvolvedor de biblioteca NuGet, as novas ferramentas de validação de pacotes permitem validar se os pacotes são consistentes e bem formados. Você pode determinar se:

  • Há quaisquer alterações significativas nas versões do pacote.
  • O pacote tem o mesmo conjunto de APIs públicas para todas as implementações específicas de tempo de execução.
  • Existem lacunas para a aplicabilidade da estrutura de destino ou do tempo de execução.

Para obter mais informações, consulte a postagem do blog Validação de pacote .

APIs de reflexão

O .NET 6 apresenta as seguintes novas APIs que inspecionam o código e fornecem informações de anulabilidade:

Essas APIs são úteis para ferramentas baseadas em reflexão e serializadores.

Microsoft.Extensions APIs

Vários namespaces de extensões têm melhorias no .NET 6, como mostra a tabela a seguir.

Espaço de Nomes Melhorias
Microsoft.Extensions.DependencyInjection CreateAsyncScope permite que você use com segurança uma using declaração para um provedor de serviços que registra um IAsyncDisposable serviço.
Microsoft.Extensions.Hosting Novos ConfigureHostOptions métodos simplificam a configuração do aplicativo.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging tem um novo gerador de código-fonte para APIs de log de desempenho. O gerador de origem é acionado se você adicionar o novo LoggerMessageAttribute a um partial método de registro. Em tempo de compilação, o gerador gera a implementação do método, que normalmente é mais rápido em tempo de execução do que as partial soluções de log existentes. Para obter mais informações, consulte Geração de origem de log em tempo de compilação.

Novas APIs LINQ

Vários métodos LINQ foram adicionados ao .NET 6. A maioria dos novos métodos listados na tabela a seguir tem métodos equivalentes no System.Linq.Queryable tipo.

Método Description
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Tenta determinar o número de elementos em uma sequência sem forçar uma enumeração.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Divide os elementos de uma sequência em partes de um tamanho especificado.
Enumerable.MaxBy e Enumerable.MinBy Localiza elementos máximos ou mínimos usando um seletor de chave.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectBy, e Enumerable.UnionBy Essas novas variações de métodos que executam operações baseadas em conjunto permitem especificar a igualdade usando uma função seletora de chave.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) e Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Aceita índices contados do início ou do fim da sequência — por exemplo, Enumerable.Range(1, 10).ElementAt(^2) retorna 9.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) e Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) e Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) e Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Novas sobrecargas permitem especificar um valor padrão a ser usado se a sequência estiver vazia.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) e Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) Novas sobrecargas permitem especificar um comparador.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Aceita um Range argumento para simplificar a obtenção de uma fatia de uma sequência — por exemplo, você pode usar source.Take(2..7) em vez de source.Take(7).Skip(2).
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) Produz uma sequência de tuplas com elementos de três sequências especificadas.

Melhorias de data, hora e fuso horário

As duas estruturas a seguir foram adicionadas no .NET 6: System.DateOnly e System.TimeOnly. Estes representam a parte da data e a parte da hora de um DateTime, respectivamente. DateOnly é útil para aniversários e aniversários, e TimeOnly é útil para alarmes diários e horas comerciais semanais.

Agora você pode usar a Internet Assigned Numbers Authority (IANA) ou IDs de fuso horário do Windows em qualquer sistema operacional que tenha dados de fuso horário instalados. O TimeZoneInfo.FindSystemTimeZoneById(String) método foi atualizado para converter automaticamente sua entrada de um fuso horário do Windows para um fuso horário IANA (ou vice-versa) se o fuso horário solicitado não for encontrado no sistema. Além disso, os novos métodos TryConvertIanaIdToWindowsId(String, String) e TryConvertWindowsIdToIanaId foram adicionados para cenários em que você ainda precisa converter manualmente de um formato de fuso horário para outro.

Há algumas outras melhorias de fuso horário também. Para obter mais informações, consulte Aprimoramentos de data, hora e fuso horário no .NET 6.

Classe PriorityQueue

A nova PriorityQueue<TElement,TPriority> classe representa uma coleção de itens que têm um valor e uma prioridade. Os itens são retirados da fila em ordem de prioridade crescente, ou seja, o item com o menor valor de prioridade é retirado da fila primeiro. Esta classe implementa uma estrutura de dados de pilha mínima.

Consulte também