|
Hoje teremos uma análise das novidades do .NET 11 Preview 5 e C# 15, com exemplos práticos do mundo real para Union Types, Closed Class Hierarchies, Full Outer Join no LINQ e diagnósticos do EF Core. |

switch totalmente exaustiva sem a
necessidade de uma cláusula
default:
public record class Cachorro(string Nome); public record class Gato(int Vidas); // Declaração do tipo Union public union Pet(Cachorro, Gato); // O compilador valida se todos os tipos da Union foram tratados static string Descrever(Pet pet) => pet switch { Cachorro(string nome) => $"Cachorro: {nome}", Gato(int vidas) => $"Gato com {vidas} vidas" }; |
Pet
futuramente e não atualizar o
switch, o compilador emitirá um aviso de
compilação (*warning*), garantindo maior segurança em tempo de
desenvolvimento.
closed para classes
base. Ao marcar uma classe como
closed, você restringe a herança direta apenas a tipos
declarados dentro do mesmo *assembly*.
// Classe base fechada para herança fora deste assembly public closed record class ResultadoPagamento; // Subclasses explicitamente permitidas dentro do projeto public record class Sucesso(string TransacaoId) : ResultadoPagamento; public record class Falha(string Motivo) : ResultadoPagamento; public record class Pendente(DateTime Previsao) : ResultadoPagamento; // Garantia de verificação exaustiva sem necessidade de default static string Processar(ResultadoPagamento resultado) => resultado switch { Sucesso(var id) => $"Aprovado! Transação: {id}", Falha(var motivo) => $"Recusado: {motivo}", Pendente(var data) => $"Aguardando até {data:dd/MM/yyyy}" }; |
abstract
e
sealed é que o próprio compilador consegue provar
que a hierarquia está selada, impondo rigor nos comandos
switch.FULL OUTER JOIN
há décadas, as consultas LINQ em memória exigiam combinatórias complexas com
GroupJoin e SelectMany.
O .NET 11 simplifica isso introduzindo o método
FullJoin diretamente no LINQ:
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?.Nome ?? "(fora do catálogo)", Vendidos = venda?.Quantidade ?? 0, }); |
IQueryable, traduzindo a consulta
diretamente para o banco de dados.
.Result
ou
.GetAwaiter().GetResult()
em consultas do EF). Essa prática é uma das maiores causadoras de *starvation*
de threads e *deadlocks* sob carga em aplicações ASP.NET Core.
System.Text.Json agora suporta essa
formatação nativamente via parâmetro
topLevelValues: true:
await JsonSerializer.SerializeAsyncEnumerable( stream, ObterLeituras(), topLevelValues: true); |
Random.Shared, foram
adicionadas sobrecargas genéricas como
NextInteger<T>() e
NextBinaryFloat<T>(), eliminando a necessidade de
converter ou checar tipos manualmente ao escrever algoritmos genéricos.[SupplyParameterFromSession]
para vincular dados da sessão aos componentes.E estamos
conversados..![]()
"Para que possais andar dignamente diante do Senhor, agradando-lhe em tudo,
frutificando em toda a boa obra, e crescendo no conhecimento de Deus;"
Colossenses 1:10
Referências: