.NET 11 : Novidades C# , LINQ e EF Core

Este artigo apresenta as principais novidades anunciadas com o .NET↳.NET113 conteúdosNovidades do .NET 9 – o tipo genérico OrderedDictionaryDev (Back & Front) · dez 2024Novidades .NET 10: novas formas de uso do .NET CLIDev (Back & Front) · dez 2025Novidades do .NET 5: implementando um proxy reverso com YARP + ASP.NET 5Dev (Back & Front) · nov 2020Ver tudo em Dev (Back & Front) → 11 Preview 5 e C# 15, incluindo Union Types, Full Outer Joins no LINQ, avisos de assincronismo no EF Core e melhorias no Blazor e JSON Lines.
A Microsoft lançou o .NET 11 Preview 5. Esta ainda é uma versão de pré-visualização (Preview), portanto não a execute em produção. Mas se você quiser saber o que está por vir antes do lançamento oficial do .NET 11 em novembro, confira os principais destaques a seguir.
1. C# 15 ganha tipos Union (Discriminated Unions)
Esta é uma das novidades mais aguardadas do C# 15. Se você já usou TypeScript ou F# e sentia falta de discriminated unions no C#, esta é a atualização ideal.
public record class Cachorro(string Nome);
public record class Gato(int Vidas);
public union Pet(Cachorro, Gato);
static string Descrever(Pet pet) => pet switch
{
Cachorro(string nome) => $"aachorro: {nome}",
Gato(int vidas) => $"gato: {vidas}"
};
Agora, Pet é estritamente um Cachorro ou um Gato. O compilador sabe exatamente qual tipo está sendo manipulado, e a expressão switch torna-se exaustiva — nenhum caso default é necessário. Se você esquecer de tratar uma das opções, o compilador emitirá um aviso.
Há também um recurso relacionado chamado Closed Class Hierarchies (hierarquias de classe fechadas). Ao marcar uma classe base como closed, o compilador restringe a herança direta apenas ao mesmo assembly:
/// Declara a classe base como closed (fechada)
public closed record class ResultadoPagamento;
// Subclasses derivadas que representam TODOS os cenários possíveis
public record class Sucesso(string TransacaoId) : ResultadoPagamento;
public record class Falha(string Motivo) : ResultadoPagamento;
public record class Pendente(DateTime Previsao) : ResultadoPagamento;
// Como a classe pai é 'closed', o compilador SABE que só existem esses 3 casos.
// Se você esquecer de tratar um deles, o código nem compila!
static string Processar(ResultadoPagamento resultado) => resultado switch
{
Sucesso(var id) => $"Pagamento aprovado! ID: {id}",
Falha(var motivo) => $"Erro no pagamento: {motivo}",
Pendente(var data) => $"Aguardando processamento até {data:dd/MM/yyyy}"
};
A ideia é a mesma: comandos switch exaustivos e sem brechas para tipos não mapeados. A diferença em relação ao padrão abstract + sealed é que agora o próprio compilador consegue provar e impor o fechamento da hierarquia.
2. LINQ recebe suporte nativo a Full Outer Joins
Desenvolvedores SQL↳SQL64 conteúdosSQL Server – Como evitar SQL Injection?Data · mai 2019Azure SQL DB Managed InstanceData · abr 2019SQL Server – Como evitar SQL Injection? Pare de utilizar Query Dinâmica como EXEC(@Query)Data · abr 2019Ver tudo em Data → utilizam FULL OUTER JOIN há décadas, mas as consultas LINQ em memória não possuíam um método direto para isso até agora.
Produto[] catalogo =
[
new("A100", "Teclado"),
new("B200", "Mouse"),
];
Venda[] vendas =
[
new("B200", 4),
new("C300", 2),
];
IEnumerable<object> linhas = catalogo.FullJoin(
vendas,
produto => produto.Sku,
venda => venda.Sku,
(produto, venda) => new
{
Sku = produto?.Sku ?? venda!.Sku,
Nome = produto?.Name ?? "(fora do catálogo)",
Vendidos = venda?.Quantity ?? 0,
});
Pendente(var data) => $"Aguardando processamento até {data:dd/MM/yyyy}"
}; O método FullJoin retorna tanto os registros correspondentes quanto os não correspondentes de ambos os lados. Além do uso em memória, no EF Core esse método está disponível via Queryable, traduzindo o join diretamente no banco de dados.
3. EF Core: Avisos de assincronismo (EF1004) e SQL otimizado
O Entity Framework Core recebeu duas grandes melhorias no Preview 5:
– Analisador EF1004: Alerta quando consultas assíncronas são executadas de forma síncrona (ex: chamando .Result ou .GetAwaiter().GetResult()), prevenindo deadlocks sob carga pesada em produção.
– Tradução de SQL mais limpa: A geração de consultas reduz subconsultas e JOINs desnecessários, gerando comandos SQL mais diretos e eficientes.
4. System.Text.Json e suporte a JSON Lines (NDJSON)
O formato JSON Lines (onde cada linha representa um objeto JSON independente) é amplamente utilizado em streams de logs e pipelines de dados.
Agora é possível serializar diretamente para esse formato utilizando o parâmetro topLevelValues: true:
await JsonSerializer.SerializeAsyncEnumerable(
stream,
GetReadings(),
topLevelValues: true);Isso elimina a necessidade de formatar quebras de linha manualmente ou gerenciar colchetes de array.
5. APIs Genéricas em Random e novidades no SDK e Blazor
A classe Random ganhou métodos genéricos como NextInteger<T>() e NextBinaryFloat<T>(), facilitando a geração de números aleatórios em algoritmos genéricos sem a necessidade de castings ou checagens de tipo.
Além disso, o SDK traz:
– Modelo MCP↳MCP7 conteúdosArquitetura de Sistemas Cognitivos: Integração de RAG, MCP e LLMs no Ecossistema .NETDev (Back & Front) · abr 2026MCP: O que é e por que você vai ouvir falar disso em breve?AI · jul 2025Agentes de IA com LLMs de Código Aberto: Integração Prática com o Model Context Protocol (MCP)AI · ago 2025Ver tudo em AI → Server: Suporte nativo via dotnet new para criar servidores baseados no Model Context Protocol para integração com IA.
– Checagem de vulnerabilidades no Build: Avisos automáticos durante a compilação caso pacotes NuGet possuam CVEs conhecidos ou estejam em fim de vida (EOL).
– Melhorias no Blazor: Validação client-side no Blazor SSR sem necessidade de interatividade total, compatibilidade do QuickGrid com SSR estático e o novo atributo SupplyParameterFromSession.
Conclusão:
O .NET 11 e o C# 15 continuam evoluindo com foco em produtividade, segurança de código e desempenho. Se quiser testar esses recursos, baixe o SDK do .NET 11 Preview 5 e experimente as novidades em um projeto de testes antes do lançamento final em novembro.











