O Que Há de Novo no .NET 11: Um Mapa da Plataforma
Objective
O .NET 11 chegou em disponibilidade geral em 10 de novembro de 2026. É uma release de
suporte padrão (STS), então não substitui o .NET 10 LTS como padrão seguro, e mesmo assim
importa no dia em que sai: todo projeto que mira net11.0 ganha o C# 15, e todo app que
roda no runtime 11 recebe as mudanças de comportamento, até um app que ainda diz net10.0.
Este concept é o hub da release, não um tutorial. Cobre o runtime, o SDK e a CLI e a
biblioteca base (BCL), e aponta para os concepts de C#, ASP.NET Core e EF Core, que têm
mapas próprios. O que está nesta página foi rodado no SDK 11.0.100 (runtime 11.0.0, macOS
arm64) e comparado com o SDK 10.0.100 quando a diferença era o ponto. Itens tirados só das
páginas da Microsoft estão marcados como "só doc", e o que as páginas ainda chamam de
preview está marcado como preview. O lado do upgrade, o que quebra e como encontrar, está em
upgrading-to-dotnet-11-and-reading-breaking-changes.
Use Cases
- Decidir se vale mover um serviço do .NET 10 para o .NET 11 agora ou esperar.
- Achar o concept profundo por trás de uma manchete da release sem ler as release notes.
- Revisar um pull request que troca para
net11.0e saber o que mais mudou junto. - Separar o que é automático (comportamento de runtime e SDK), o que precisa de chave e o que ainda é preview.
Deep Dive
Suporte e versões
O .NET 11 é uma release STS. O índice de releases no dia do GA o lista como ativo até 14 de
novembro de 2028, o mesmo fim do .NET 10 LTS, então a diferença prática é acompanhar patches
numa base mais nova pelo mesmo período. O .NET 8 e o .NET 9 saíram de suporte em 10 de
novembro de 2026. O calendário e a escolha do alvo estão em
dotnet-support-lifecycle-and-choosing-a-target. As páginas usadas aqui não dizem qual
release é a próxima LTS, então este concept também não diz.
O runtime decide, não o target framework
O fato mais útil para uma migração é também o menos visível. O comportamento da biblioteca
base vem do runtime que executa o programa, e o TargetFramework só escolhe qual é esse
runtime. O mesmo código rodou em três combinações: SDK 10 com net10.0 no runtime 10, SDK 11
com net11.0 no runtime 11, e SDK 11 com net10.0 mas executado no runtime 11 (com
DOTNET_ROLL_FORWARD=Major, porque não havia runtime 10 para usar):
csharpbyte b = (byte)double.Parse("300.0"); // runtime 10: 44 runtime 11: 255
decimal d = (decimal)(0.1 + double.Parse("0.2")); // 0.3 0.3000000000000000444089209850
double r = Math.Round(double.Parse("2.675"), 2); // 2.68 2.67O app net10.0 no runtime 11 imprimiu os valores do 11. Por padrão um app net10.0 não faz
roll forward para um runtime de major mais novo, mas uma imagem de contêiner, um host com
RollForward configurado ou uma publicação self-contained decidem por você. O concept de
upgrade tem a tabela completa e as outras mudanças desse tipo.
Runtime
- Runtime async. No .NET 11 o próprio runtime pode suspender e retomar métodos
async, então o compilador não gera máquina de estados para eles. As bibliotecas da plataforma são construídas assim, então todo app no 11 já roda sobre isso. O seu código entra com<Features>runtime-async=on</Features>, e a documentação ainda classifica o recurso como preview. Stack traces e perfis ficam diferentes. A mecânica está emtask-and-async-await-internals. - JIT e GC (só doc). A página do runtime lista mais eliminação de bounds check, novos casos de devirtualização e comparadores padrão especializados. Nada disso foi medido aqui, então trate como motivo para fazer benchmark da sua carga, não como número.
- Piso de hardware (só doc). As páginas elevam o conjunto mínimo de instruções da CPU, então uma máquina muito antiga ou um emulador pode recusar iniciar o runtime. Confira isso antes de mover uma frota de contêineres, não depois.
SDK e CLI
- File-based apps podem ter vários arquivos.
#:include greeter.cspuxou um segundo arquivo para o build no SDK 11, e a mesma linha falha comUnrecognized directive 'include'no SDK 10.0.100.dotnet run -e FOO=bar app.cspassou a variável para o programa. Deep dive:file-based-apps. - Soluções.
dotnet new slncrioudemo.slnxno SDK 11 edemo.slnno 10.0.100. Os arquivos de projeto estão emsdk-style-projects-msbuild-and-directory-build-props. - Ferramentas de uma execução.
dotnet tool execnão pede mais confirmação antes de rodar uma ferramenta baixada, e a documentação diz o mesmo dodnx. Em CI isso significa executar código sem nenhuma barreira, então fixe a versão. Vejadotnet-cli-and-noun-first-commands. - Publish Native AOT. O SDK tem um publish otimizado que pula o build completo e seus hooks
AfterBuildePostBuildEvent. No SDK GA ele é opt-in comUseOptimizedPublish=true; o publish padrão ainda roda esses hooks. Os builds RC se comportavam de outro jeito, então uma nota escrita antes do GA pode dizer o contrário. Os detalhes estão no concept de upgrade e emnative-aot-and-its-limits. - Também listados pelas páginas (só doc): a própria CLI compilada com Native AOT, um servidor de MSBuild ligado por padrão, novas opções de contêiner e as mudanças de NuGet (uma idade mínima de pacote no restore, um restore que deixa de usar a pasta global de pacotes para escolher a próxima melhor versão).
Bibliotecas
Cada linha abaixo foi rodada no 11.0.100:
csharpvar r = Process.RunAndCaptureText("sh", ["-c", "echo out; echo err 1>&2; exit 3"]);
// exit=3 stdout=out stderr=err
a.FullJoin(b, l => l.Item1, r => r.Item1, (l, r) => $"{l.Item1}:{l.Item2}/{r.Item1}:{r.Item2}");
// 1:a/0: | 2:b/2:x | 0:/3:y (o lado ausente chega como default)
using var z = new ZstandardStream(ms, CompressionMode.Compress, leaveOpen: true);
// 1000 bytes de 'a' -> 18 bytes, ida e volta com 1000
JsonSerializer.SerializeAsyncEnumerable(stream, Numbers(), topLevelValues: true);
// 0\n1\n (JSON Lines)
int.TryParsePartial("123abc", NumberStyles.Integer, CultureInfo.InvariantCulture, out v, out consumed);
// True 123 consumed=3
"a\U0001F600b".Contains(new Rune(0x1F600)); // True, IndexOf dá 1
new Regex("^b$", RegexOptions.Multiline | RegexOptions.AnyNewLine).IsMatch("a\u0085b\u0085c");
// True com AnyNewLine, False semOutras adições que foram conferidas e rodam: EqualityComparer<T>.Create sobre um seletor
de chave, Random.Shared.NextInteger<byte>(10, 20), os streams sobre memória StringStream
(sem seek) e ReadOnlyMemoryStream, e os tipos Decimal32, Decimal64 e Decimal128 em
System.Numerics. Os concepts que explicam isso são linq-sets-joins-grouping-and-lookups,
compression-zip-gzip-brotli-and-tar, stream-class-hierarchy-and-decorators,
parsing-tryparse-and-the-try-pattern, unicode-runes-and-text-encodings,
regular-expressions-in-depth e numeric-types-and-binary-representation. Process.Run* ainda
não tem concept próprio.
As adições de criptografia e rede (novos algoritmos de troca e de embrulho de chave, combinações pós-quânticas, DNS tipado e TLS dirigido pelo chamador) são listadas pelas páginas e não foram rodadas aqui. Algumas delas ainda são marcadas como preview lá.
C#, ASP.NET Core e EF Core
Cada um dos três tem mapa próprio, e este hub só diz o que abrir:
- C# 15 é a versão de linguagem padrão em
net11.0: argumentos para collection expressions (with(...)), union types, closed classes, indexadores em extension members ebreakecontinuecom rótulo, enquanto as regras de memory safety ainda são preview. Comece emwhats-new-in-csharp-15. O compilador também rejeita algumas coisas que o compilador do 10 aceitava, e isso está no concept de upgrade. - ASP.NET Core 11 agrupa as mudanças em automáticas, opt-in, breaking e experimentais.
whats-new-in-aspnet-core-11é o mapa emigrating-from-aspnet-core-10-to-11é o checklist, com o erro de restore do NuGet vindo do OpenAPI, o padrão OpenAPI 3.2 e oRunAsynclançando exceção quando um hosted service falha. - EF Core 11 traz SQL mais enxuto, novas traduções, índices de caminho JSON e um
LastMigrationIdno snapshot, com novidades de SQL Server 2025 e Cosmos DB.whats-new-in-ef-core-11é o mapa eupgrading-from-ef-core-10-to-11-breaking-changesé o checklist.
Trade-offs
- STS é uma promessa mais curta, não uma release pior. A data de fim coincide com a da LTS que você talvez já rode, então a pergunta é quanta mudança você quer carregar agora. Um serviço com testes fracos pode ficar no .NET 10 até a rede de segurança melhorar.
- Instalar o runtime pode mudar o comportamento antes de você trocar o alvo. Qualquer coisa
que rode um app
net10.0no runtime 11 (um roll forward, uma imagem base que andou) entrega a ele a biblioteca base nova.csharp(byte)double.Parse("300.0") // 44 no runtime 10, 255 no runtime 11, mesmo app net10.0 - Padrões e opt-ins mudaram entre o RC e o GA. O publish Native AOT otimizado foi relatado
como padrão nos release candidates e é opt-in no SDK GA. Rode suas próprias conferências no
build GA em vez de confiar em um texto escrito sobre o preview.plaintext
<UseOptimizedPublish>true</UseOptimizedPublish> - Um mapa esconde profundidade. Cada item é uma manchete. As páginas da Microsoft continuam sendo editadas e esta página registra o que era verdade no 11.0.100 em 12 de novembro de 2026.
- Itens em preview não são um plano. O runtime async no seu código e as regras de memory safety podem mudar antes de ficarem estáveis. Teste numa branch, não numa release.