A maior e melhor Black Friday que já fizemos! Descontos a partir de 50% em até 12x sem juros - Garanta seu Desconto

Novidades do .NET 11: runtime, C# 15, ASP.NET Core e EF Core

Novidades do .NET 11: runtime, C# 15, ASP.NET Core e EF Core

As novidades do .NET 11 cobrem o runtime, as bibliotecas, o SDK, a linguagem C# 15, o ASP.NET Core e o EF Core. Neste artigo, reunimos as principais mudanças com exemplos práticos, para que você saiba o que muda no seu código e como se preparar para a versão final.

O que é o .NET 11 e quando ele chega

O .NET 11 é a próxima versão principal da plataforma da Microsoft. Ela segue o ciclo anual de lançamentos, que sempre entrega uma nova versão em novembro.

Diferente do .NET 10, porém, o .NET 11 é uma versão STS (Standard Term Support). Ou seja, ela recebe suporte por dois anos, de 10 de novembro de 2026 até 9 de novembro de 2028.

Neste momento, a plataforma está na fase de release candidate. Essa fase traz uma licença go live, que permite usar a versão em produção com suporte oficial da Microsoft.

Por isso, o período atual é ideal para testar as novidades do .NET 11 nos seus projetos. Assim, você identifica problemas de compatibilidade antes do lançamento oficial, previsto para a .NET Conf 2026.

Além disso, vale lembrar que o .NET 8 e o .NET 9 encerram o suporte em novembro de 2026. Portanto, quem ainda está nessas versões precisa planejar a migração com atenção.

Novidades do .NET 11 no runtime

O runtime concentra algumas das mudanças mais profundas desta versão. Em geral, elas melhoram o desempenho sem exigir nenhuma alteração no seu código.

Entre as novidades do .NET 11 no runtime, a Microsoft atualizou os requisitos mínimos de hardware para x86, x64 e Arm64. Com isso, o runtime passa a exigir conjuntos de instruções mais modernos, o que simplifica a manutenção e melhora a performance.

Runtime Async sem flag de preview

A principal novidade do runtime é o Runtime Async. Até o .NET 10, o compilador gerava uma máquina de estados para cada método assíncrono.

Agora, o próprio runtime controla a suspensão e a retomada desses métodos. Na prática, isso gera stack traces mais limpos, depuração mais simples e menos overhead em cada await.

Além disso, projetos que usam net11.0 não precisam mais da propriedade EnablePreviewFeatures para usar o recurso. Inclusive, as próprias bibliotecas do runtime já são compiladas com o Runtime Async ativo.

<PropertyGroup>
  <!-- Ativa o Runtime Async no projeto -->
  <Features>runtime-async=on</Features>
</PropertyGroup>

Caso você precise desativar o recurso em um projeto específico, use a propriedade UseRuntimeAsync com o valor false. Por outro lado, as antigas variáveis de ambiente DOTNET_RuntimeAsync e UNSUPPORTED_RuntimeAsync deixaram de existir.

Melhorias no JIT e no NativeAOT

O JIT também aparece entre as novidades do .NET 11, com uma série de otimizações. Por exemplo, ele elimina verificações de limites de array depois de uma checagem de span vazio.

public static bool StartsWith(ReadOnlySpan<int> span, int value)
{
    // O JIT remove a verificação de limites em span[0]
    return !span.IsEmpty && span[0] == value;
}

Da mesma forma, o JIT remove testes redundantes, faz devirtualização com mais frequência e dobra expressões switch em tempo de compilação. Além disso, o Math.BigMul no x64 agora emite uma única instrução MUL.

No NativeAOT, as chamadas de interface passaram a usar um helper de dispatch compartilhado. Como resultado, o binário fica menor e cargas de trabalho com muitas interfaces ganham throughput.

Também há novas APIs SIMD, como CreateGeometricSequence, Zip e Unzip, disponíveis em Vector128<T>, Vector256<T> e nos demais tipos vetoriais. Por fim, o tipo Half passa a usar instruções FP16 de hardware no x64 e no Arm64.

Novidades do .NET 11 nas bibliotecas

As bibliotecas base receberam uma lista extensa de APIs. A seguir, destacamos as que mais impactam o dia a dia de quem desenvolve aplicações.

Process, compressão e streams

Entre as novidades do .NET 11 para bibliotecas, a classe Process recebeu a maior atualização em anos. Agora, ela oferece helpers para executar e capturar a saída, o método TryGetProcessById e o envio de sinais POSIX com Process.Signal.

Na área de compressão, o Zstandard passou a fazer parte do namespace System.IO.Compression. Além disso, a leitura de entradas ZIP agora valida o CRC32, o que evita arquivos corrompidos silenciosamente.

O .NET 11 também traz quatro novos tipos de Stream que encapsulam dados em memória sem cópia: ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream e StringStream.

Já o System.Text.Json ganhou suporte a unions do C# e do F#, saída em JSON Lines e mais controle sobre nomes e propriedades ignoradas. Enquanto isso, o MemoryCache passou a emitir métricas do OpenTelemetry de forma nativa.

LINQ com FullJoin e novos tipos numéricos

Uma das novidades do .NET 11 mais pedidas pela comunidade é o operador FullJoin no LINQ. Ele mantém os itens das duas coleções e combina aqueles cujas chaves são iguais.

var report = customers.FullJoin(
    orders,
    customer => customer.Id,
    order => order.CustomerId,
    (customer, order) => new { CustomerName = customer?.Name, OrderId = order?.Id });

O operador funciona em Enumerable, Queryable e AsyncEnumerable. Além disso, Join e GroupJoin ganharam sobrecargas que retornam tuplas, o que reduz a necessidade de projeções anônimas.

No campo numérico, chegam os tipos decimais do padrão IEEE 754: Decimal32, Decimal64 e Decimal128. Também chegam o Complex<T> genérico e os métodos NextInteger<T> e NextBinaryFloat<T> no Random.

Outro destaque é o EqualityComparer<T>.Create, que cria um comparador a partir de um seletor de chave. Por exemplo, você pode comparar produtos apenas pelo código, sem escrever uma classe dedicada.

// Compara produtos apenas pelo SKU
var comparer = EqualityComparer<Product>.Create(product => product.Sku);
var uniqueProducts = products.Distinct(comparer).ToList();

Na segurança, a nova classe X25519DiffieHellman permite a troca de chaves X25519. Da mesma forma, a classe Aes passa a suportar o AES Key Wrap sem padding.

C# 15: o que muda na linguagem

O C# 15 é a versão padrão da linguagem e acompanha as novidades do .NET 11 em todos os projetos novos. Portanto, ao atualizar o target framework, você já tem acesso aos novos recursos.

Union types e hierarquias fechadas

Os union types são, sem dúvida, a mudança mais aguardada do C# 15. Eles representam um valor que pode ser de um entre vários tipos, chamados de case types.

public record class CreditCard(string Last4Digits);
public record class Pix(string Key);
public record class BankSlip(string Barcode);

public union PaymentMethod(CreditCard, Pix, BankSlip);

Com isso, o compilador cria conversões implícitas para cada caso. Além disso, ele garante que as expressões switch tratem todos os tipos possíveis.

PaymentMethod payment = new Pix("contact@example.com");

string description = payment switch
{
    CreditCard card => $"Card ending in {card.Last4Digits}",
    Pix pix => $"Pix key {pix.Key}",
    BankSlip slip => $"Bank slip {slip.Barcode}",
};

Já as hierarquias fechadas usam o modificador closed. Nesse caso, apenas o assembly que declara a classe pode derivar dela, então o compilador conhece todos os descendentes diretos.

public closed record class OrderStatus;
public record class Pending : OrderStatus;
public record class Shipped(string TrackingCode) : OrderStatus;

// Não precisa de default: todos os casos estão cobertos
string Describe(OrderStatus status) => status switch
{
    Pending => "pending",
    Shipped(var code) => $"shipped with {code}",
};

Na prática, os dois recursos eliminam o braço default que muitas vezes esconde bugs. Assim, quando alguém adiciona um novo caso, o compilador aponta todos os pontos que precisam de ajuste.

Argumentos em collection expressions e break rotulado

As collection expressions agora aceitam o elemento with(...) na primeira posição. Com ele, você passa argumentos para o construtor da coleção, como capacidade ou comparador.

string[] tags = ["dotnet", "csharp", "aspnet"];

// Define a capacidade inicial da lista
List<string> allTags = [with(capacity: tags.Length * 2), .. tags];

// Usa um comparador que ignora maiúsculas e minúsculas
HashSet<string> keywords = [with(StringComparer.OrdinalIgnoreCase), "Api", "API", "api"];

Outro recurso útil é o break e o continue com rótulo. Em vez de usar flags booleanas ou goto, você indica diretamente qual laço deve ser interrompido.

outer: for (int row = 0; row < grid.Height; row++)
{
    for (int column = 0; column < grid.Width; column++)
    {
        if (grid[row, column].IsBlocked)
        {
            // Pula para a próxima linha
            continue outer;
        }
    }
}

O C# 15 também traz indexadores em blocos extension, que completam o recurso de extension members do C# 14. Além disso, a linguagem inicia um trabalho de vários anos para redefinir a segurança de memória em torno do contexto unsafe.

Novidades do .NET 11 no ASP.NET Core e no Blazor

No ASP.NET Core, a observabilidade ganhou destaque. Agora, o framework adiciona os atributos de convenção semântica do OpenTelemetry diretamente na activity de cada requisição HTTP.

Ou seja, você não precisa mais do pacote OpenTelemetry.Instrumentation.AspNetCore para obter os atributos principais. Basta assinar a fonte de atividades Microsoft.AspNetCore.

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing => tracing
        // Assina a fonte nativa do ASP.NET Core
        .AddSource("Microsoft.AspNetCore")
        .AddConsoleExporter());

O middleware de compressão também passou a suportar o Zstandard, tanto na resposta quanto na descompressão da requisição. Enquanto isso, o parser HTTP/1.1 do Kestrel deixou de lançar exceções para requisições malformadas, o que melhora o throughput em até 40% nesses cenários.

Além disso, se você já tem um pipeline de erros bem estruturado, como mostramos no artigo sobre tratamento global de exceções com IExceptionHandler, a migração tende a ser tranquila.

No Blazor, o TempData chegou à renderização estática no servidor. Com isso, padrões como POST, Redirect e GET ficam mais simples, por exemplo para exibir mensagens depois do envio de um formulário.

[SupplyParameterFromTempData]
public string? SuccessMessage { get; set; }

Os formulários em SSR estático também ganharam validação no lado do cliente, sem ida ao servidor. Da mesma forma, o EditForm passou a aguardar validadores assíncronos, como consultas ao banco de dados.

O componente Virtualize agora lida com itens de alturas diferentes, e o QuickGrid ganhou novos modos de paginação. Por fim, o Blazor ganhou componentes de IA para interfaces com agentes, que detalhamos no guia de Blazor AI components.

EF Core 11 e as novidades do .NET 11 para dados

O EF Core 11 acompanha as novidades do .NET 11 e traduz o novo operador FullJoin para FULL JOIN em bancos relacionais. Além disso, ele passa a traduzir MaxByAsync e MinByAsync.

// Busca o blog com mais posts em uma única consulta
var topBlog = await context.Blogs.MaxByAsync(blog => blog.Posts.Count());

Nas migrations, o comando dotnet ef database update ganhou a opção --add. Com ela, você cria e aplica uma migration em um único passo, o que ajuda em cenários com Aspire e containers.

# Cria a migration e aplica no banco em seguida
dotnet ef database update InitialCreate --add

Também é possível manter uma chave estrangeira no modelo sem criar a constraint no banco, com o método ExcludeForeignKeyFromMigrations. Isso ajuda bastante em bancos legados ou em cenários de sincronização de dados.

Outra mudança importante é que o model snapshot registra o ID da última migration. Assim, quando dois desenvolvedores criam migrations em branches diferentes, o Git aponta um conflito e o time percebe a divergência logo.

Para quem usa SQL Server, as colunas SqlVector<T> não entram mais no SELECT padrão. Segundo a documentação oficial, essa mudança deixou consultas até 22 vezes mais rápidas em um banco remoto no Azure.

Já o provider do Cosmos DB trocou o Newtonsoft.Json pelo System.Text.Json, suporta complex types e usa transactional batches por padrão. No entanto, essas mudanças trazem breaking changes, então revise a documentação antes de atualizar.

Novidades do .NET 11 no SDK e na CLI

O SDK reúne novidades do .NET 11 que tornam o dia a dia mais produtivo. Primeiro, os instaladores ficaram menores no Linux e no macOS, graças à deduplicação de assemblies.

Os file based apps, introduzidos no .NET 10, agora aceitam a diretiva #:include. Com isso, você divide uma aplicação de arquivo único em vários arquivos, sem precisar de um .csproj.

#:include Models.cs
#:package Humanizer@2.14.1

using Humanizer;

var order = new Order(42, DateTime.UtcNow.AddHours(-3));
Console.WriteLine($"Order {order.Id} created {order.CreatedAt.Humanize()}");

O comando dotnet run ganhou a opção -e para passar variáveis de ambiente. Já o dotnet watch passou a integrar com o app host do Aspire e a se recuperar automaticamente de falhas.

O dotnet test também evoluiu bastante. Entre as novidades estão as opções --timeout e --maximum-failed-tests, além do suporte a projetos Android, iOS e macOS.

Além disso, os templates de teste passaram a suportar o xUnit v3 com o Microsoft Testing Platform. Por sua vez, a CLI em NativeAOT e o servidor do MSBuild agora vêm ativos por padrão, o que acelera os comandos.

Na publicação de containers, o SDK prefere runtimes nativos da plataforma antes do Docker e do Podman. Também gera digests reproduzíveis por meio da variável SOURCE_DATE_EPOCH.

Como experimentar as novidades do .NET 11

Para experimentar as novidades do .NET 11, instale o SDK mais recente a partir da página oficial de downloads. Em seguida, confira a versão instalada pelo terminal.

# Lista os SDKs instalados na máquina
dotnet --list-sdks

# Cria uma API mínima já apontando para o .NET 11
dotnet new webapi -n OrdersApi -f net11.0

Em projetos existentes, altere o target framework no arquivo do projeto. Depois, compile a solução e rode os testes para identificar breaking changes.

<PropertyGroup>
  <!-- Atualiza o projeto para o .NET 11 -->
  <TargetFramework>net11.0</TargetFramework>
</PropertyGroup>

No Windows, a recomendação é usar a versão Insiders do Visual Studio 2026. Por outro lado, quem prefere outras ferramentas pode usar o Visual Studio Code com a extensão C# Dev Kit.

Antes de levar as novidades do .NET 11 para uma aplicação crítica, leia a página de breaking changes de cada componente. Isso vale especialmente para o EF Core com Cosmos DB e para o Blazor, que mudou a validação de antiforgery.

Para uma visão completa, a página What's new in .NET 11 no Microsoft Learn reúne todos os links. Além disso, ela é atualizada a cada nova versão de preview e de release candidate.

Vale a pena adotar a nova versão

A resposta depende do perfil da sua aplicação. Como o .NET 11 é uma versão STS, ele tem um ciclo de suporte menor que o do .NET 10.

Por isso, aplicações que exigem estabilidade de longo prazo podem continuar no .NET 10, que é LTS e tem suporte até 2028. Em contrapartida, times que querem os ganhos de performance e os union types podem adotar as novidades do .NET 11 logo no lançamento.

Na prática, o caminho mais seguro é testar a nova versão em um branch separado. Dessa forma, você mede o impacto real no desempenho e na compatibilidade antes de decidir.

Se você está no .NET 8 ou no .NET 9, a migração é obrigatória em breve. Afinal, essas versões deixam de receber correções de segurança em novembro de 2026.

Conclusão

As novidades do .NET 11 mostram uma plataforma que evolui em várias frentes ao mesmo tempo. O Runtime Async muda a forma como o código assíncrono roda, enquanto o C# 15 traz union types e hierarquias fechadas.

Além disso, o ASP.NET Core ganha observabilidade nativa, o Blazor amadurece no SSR estático e o EF Core simplifica as migrations. Já o SDK fica mais rápido e mais completo para testes e containers.

Portanto, este é o momento ideal para instalar a versão release candidate e validar seus projetos. Assim, quando a versão final chegar em novembro, você já sabe exatamente o que muda no seu código.

FAQ

Quando o .NET 11 será lançado oficialmente?

A Microsoft prevê o lançamento para 10 de novembro de 2026, durante a .NET Conf 2026. Até lá, a plataforma segue na fase de release candidate.

O .NET 11 é uma versão LTS?

Não, o .NET 11 é uma versão STS, com suporte de dois anos. A versão LTS mais recente continua sendo o .NET 10.

Posso usar o .NET 11 em produção antes do lançamento?

Sim, as versões release candidate incluem uma licença go live com suporte oficial. Ainda assim, teste bem a aplicação antes de publicar.

Preciso ativar algo para usar os union types do C# 15?

Não, basta usar o .NET 11, que adota o C# 15 como versão padrão. Alguns recursos de memory safety, por outro lado, ainda exigem o LangVersion em preview.

O Runtime Async muda o código que eu escrevo?

Não, você continua usando async e await da mesma forma. A diferença está na execução, que passa a ser controlada pelo runtime.

Glossário

Termo Significado
STS Standard Term Support, ciclo de suporte de dois anos para versões ímpares do .NET
LTS Long Term Support, ciclo de suporte de três anos para versões pares do .NET
Release candidate Versão quase final, com licença go live para uso em produção
Go live Licença que permite usar uma versão de pré lançamento em produção com suporte oficial
Runtime Async Modelo em que o runtime controla métodos assíncronos no lugar do compilador
JIT Compilador que transforma IL em código de máquina durante a execução
NativeAOT Compilação antecipada que gera um executável nativo, sem JIT
Union type Tipo que representa um valor entre vários tipos possíveis
Hierarquia fechada Classe marcada com closed, que só pode ser derivada no próprio assembly
FullJoin Operador LINQ que mantém os itens das duas coleções em uma junção
Zstandard Algoritmo de compressão rápido criado pelo Facebook
SSR estático Renderização de componentes Blazor no servidor sem interatividade
File based app Aplicação C# executada a partir de um único arquivo, sem .csproj

Fontes