A Microsoft lança em novembro de 2023 uma nova versão do ASP.NET, um framework multiplataforma de código aberto para a construção de aplicações modernas, baseadas na web, e com suporte a cloud. Quais são, então, as melhorias em relação a versões anteriores?


O lançamento do ASP.NET Core 8.0 surge no âmbito de uma política da Microsoft que começou na versão .NET 5, e que se reflete no lançamento de uma nova versão do framework geralmente em novembro de cada ano. O objetivo é tornar a linguagem mais competitiva, mantendo-a sempre atualizada com as demandas do mercado.


Esta nova versão traz melhorias de performance, integração com tecnologias emergentes, novas API e bibliotecas, além de melhorias no suporte a containers e orquestração. Seguem-se mais detalhes sobre algumas dessas novidades.

 

 

Novo modelo Blazor Web App

Nesta nova versão foi introduzido um novo modelo de projeto Blazor, chamado Blazor Web App, que combina os recursos do Blazor Server e do Blazor WebAssembly. Outros modelos foram consolidados, tornando a escolha mais simples. Agora, você pode usar o modelo Blazor Web App para diferentes cenários de Blazor.


Com esta tecnologia, agora é viável transmitir conteúdo em tempo real durante o processo de renderização de páginas. Esse avanço aprimora significativamente a experiência do usuário, permitindo que o conteúdo seja exibido à medida que se torna disponível, mesmo em páginas que envolvem tarefas demoradas, como consultas extensas a bancos de dados.


Inicialmente, a página é renderizada com espaços reservados e, à medida que as operações assíncronas são concluídas, o conteúdo atualizado é transmitido e integrado na página em tempo real. Essa abordagem não apenas agiliza o carregamento da página, mas também a torna mais responsiva às interações do usuário.


Agora, você pode criar componentes Razor, como HTML em formato de texto ou fluxo, sem depender de solicitações HTTP ou do ambiente de hospedagem ASP.NET Core. Isso é útil quando você precisa gerar fragmentos de HTML, como para criar e-mails ou conteúdo de sites estáticos.

 

 

Vários aprimoramentos para melhor performance

A geração de código é crucial para o desempenho das aplicações em .NET e o compilador Just-in-Time (JIT) é responsável por isso. O .NET 8 traz melhorias significativas no JIT, incluindo o uso de Profile-Guided Optimization (PGO) dinâmico, que representa um avanço notável na qualidade e desempenho do código gerado.


O PGO dinâmico é uma estratégia de otimização de código, que se baseia nas ações reais de um programa enquanto ele é executado, para melhorar sua eficiência. É chamado de “dinâmico” porque observa e coleta dados sobre o comportamento do programa em tempo real e usa essas informações para criar uma versão mais eficiente do código.


Ainda graças aos aprimoramentos no JIT, o processo de zerar variáveis foi otimizado. Quando uma quantidade significativa de zeragem é necessária, o JIT agora utiliza uma rotina de memória otimizada, em vez de gerar muito código para alcançar o mesmo resultado. Essa melhoria foi feita para otimizar o desempenho, tornando o processo mais eficiente.


Uma outra novidade do .NET 8 é a vetorização, técnica que tira proveito do poder de processamento paralelo de hardware, como Central Processing Unit (CPU) modernas, para executar operações de forma eficiente. Isso é especialmente útil em operações matemáticas e na manipulação de dados, permitindo que você processe várias informações ao mesmo tempo, o que agiliza o desempenho.


No .NET 8, o coletor de lixo do servidor tem também um novo recurso chamado Dynamic Adaptation To Application Sizes (DATAS), que permite ajustar automaticamente a memória com base no desempenho da aplicação. Essa função não é ativada por padrão, mas pode ser ligada de maneira simples através de variáveis de ambiente ou propriedades MSBuild – isso ajuda a equilibrar o desempenho e o uso de memória da aplicação. Esta evolução será descrita com maior detalhe mais à frente.

 

 

Containers

A capacidade de execução não-root nos containers Microsoft .NET é agora a configuração padrão, melhorando a segurança dos aplicativos. A marca padrão do container foi alterada para “latest”, tornando os containers mais fáceis de usar no desenvolvimento. Essas mudanças visam facilitar o uso seguro e eficiente de containers .NET.


O .NET 8 introduz ainda uma variável de ambiente para o User Identification (UID) do usuário não-root, facilitando o teste no Kubernetes. A porta padrão foi alterada de 80 para 8080, e uma nova variável de ambiente (ASPNETCORE_HTTP_PORTS) foi adicionada para simplificar a alteração de portas. Além disso, as tags de imagem de container para as prévias do .NET 8 não terão mais o sufixo “-preview”, e as novas tags “8.0” e “8.0-<SO>” serão permanentes e mantidas ao longo da vida do .NET 8. Essas mudanças visam melhorar a usabilidade e a segurança dos containers .NET.

 

 

Serialização

O .NET 8 introduz também várias melhorias significativas e novos recursos na área de serialização, com o objetivo melhorar a flexibilidade e o desempenho nas áreas de serialização e manipulação de dados.


A nova versão estende a compatibilidade para incluir novos tipos numéricos como Half, Int128 e UInt128, além de estruturas de dados como Memory<T> e ReadOnlyMemory<T>. A plataforma aprimorou ainda o gerador de código-fonte para proporcionar uma experiência mais próxima do Native AOT em comparação com métodos anteriores, adicionando suporte para tipos com propriedades obrigatórias e de inicialização, bem como introduzindo conversores mais avançados e formatos de código gerado mais limpos.


Além disso, há agora um suporte robusto para a serialização de propriedades que fazem parte de hierarquias de interfaces, com a introdução de políticas de nomenclatura que facilitam a conversão de nomes para formatos como snake_case e kebab-case.


A desserialização foi expandida para incluir campos ou propriedades somente de leitura, algo que não era possível antes, e oferece uma opção para desabilitar o serializador baseado em reflexão, ideal para aplicações que utilizam recursos de corte e Native AOT. Métodos adicionais foram integrados à API JsonNode para operações como clonagem profunda e comparação de JSONs, e novas funcionalidades permitem a inclusão de membros não públicos no contrato de serialização.


O lançamento também inclui métodos de extensão para desserialização por streaming IAsyncEnumerable<T>, um método de extensão para modificar contratos de serialização e novas sobrecargas para criação de conteúdo JSON que se alinham com as diretrizes de segurança de corte de código e geração de código-fonte.

 

 

Coletor de Lixo

Como já foi brevemente referido, o .NET 8 apresenta uma funcionalidade para modificar o limite de memória dinamicamente, ideal para ambientes de serviços em cloud com demandas variáveis. Para maximizar a eficiência econômica, os serviços agora podem escalar os recursos consumidos conforme as oscilações de demanda. Quando há uma diminuição na necessidade, os serviços têm a opção de diminuir o consumo de recursos, ajustando o limite de memória para baixo.


Em versões anteriores, a nova configuração poderia não ser reconhecida pelo Coletor de Lixo (Garbage Collector), resultando na alocação de memória acima do limite ajustado. A nova API RefreshMemoryLimit () resolve essa questão ao sincronizar o Coletor de Lixo com o limite de memória atualizado.


Contudo, há restrições a serem consideradas: 

  • Em sistemas operacionais de 32 bits, o .NET não pode definir um novo limite máximo de heap se um já não existir;
  • Também é possível que a API indique falha ao atualizar, o que pode acontecer se a redução de memória for excessiva e não deixar margem para a atuação eficaz do Coletor de Lixo. Se isso acontecer, é aconselhável realizar uma coleta de lixo agressiva com o GC.Collect (GCCollectionMode.Aggressive) para diminuir o consumo de memória antes de tentar a operação novamente;
  • Além disso, aumentar o limite de memória além da capacidade inicial estimada pelo Coletor de Lixo durante a inicialização pode não resultar no uso efetivo da memória adicional, mesmo que o processo de atualização seja bem-sucedido.

 

 

Suporte para Native AOT

A publicação como Native AOT (Ahead of Time) foi uma novidade introduzida no .NET 7, permitindo criar uma versão completamente autossuficiente de um aplicativo que dispensa a necessidade de um runtime, pois tudo é compilado em um único arquivo. No .NET 8, essa funcionalidade foi aprimorada, trazendo suporte às arquiteturas x64 e Arm64 no MacOS.


Houve também uma redução significativa no tamanho dos aplicativos AOT Nativo em Linux, chegando a uma diminuição de até 50%. Agora é possível escolher a preferência de otimização entre tamanho e velocidade. Por padrão, o compilador busca um equilíbrio entre um código rápido e um tamanho de aplicativo reduzido, mas você pode definir a propriedade MSBuild <OptimizationPreference> para otimizar especificamente para um ou outro critério. Para mais detalhes, pode consultar a documentação sobre a otimização de implantações AOT.

 

 

Conclusão

Estas são apenas algumas das melhorias do .NET 8. O constante aprimoramento do framework por parte da Microsoft vem tornando-o cada vez mais utilizado pelas empresas e cada vez mais popular entre os developers. 


O gráfico abaixo demonstra precisamente a tendência de crescimento de utilização da linguagem de programação C#, a mais popular para o desenvolvimento .NET:

 

Tiobe Index for C#

 

Fonte: https://www.tiobe.com/tiobe-index/csharp/

Partilha este artigo