What's New in .NET 10: A Map of the Platform
Objective
.NET 10 is the successor to .NET 9 and a long-term support (LTS) release, supported for three years. This concept is a map, not a tutorial: it lists what Microsoft's "What's new in .NET 10" pages say changed in the runtime, the SDK and the libraries, in a few lines each, and points to the concept in this track or in C# Concepts that explains the mechanism. Read it to decide what to study next. ASP.NET Core, EF Core and C# 14 have their own "what's new" pages and are only pointed to here. Every item below was checked against the official pages for the runtime, the SDK and the libraries.
Use Cases
- Planning an upgrade from .NET 8 or 9 and deciding which changes affect your code.
- Finding the deep concept behind a headline feature without reading release notes.
- Telling apart what is on by default (SDK behavior) from what you must opt into.
- Onboarding a team that last used .NET Framework or an older LTS.
Deep Dive
Support and versions
.NET 10 is an LTS release with three years of support. Which target to choose
for a new project, and how the support calendar works, is in the concept
"The .NET Support Lifecycle and Choosing a Target"
(dotnet-support-lifecycle-and-choosing-a-target). The language that ships with
it is C# 14: field-backed properties, extension blocks, null-conditional
assignment and more. The versions-and-preview mechanics live in
csharp-language-versions-and-preview-features, and two of the headline
features have their own concepts: properties-init-accessors-and-the-field-keyword
and extension-members-and-extension-blocks.
Runtime and JIT
The runtime page lists JIT work on struct arguments (promoted members can share
a register), loop inversion based on a graph analysis, array interface method
devirtualization, a new block layout heuristic and better inlining. Stack
allocation grows to small arrays of value types and of reference types, and
escape analysis now covers local struct fields and delegates. On Arm64 the new
write-barrier default improves GC pauses; the page cites 8% to over 20%. AVX10.2
intrinsics exist but JIT support is disabled by default, because capable
hardware was not yet available. NativeAOT also gets small preinitializer
improvements. To read how source becomes machine code, see
roslyn-il-and-the-jit. For why "structs on the stack, classes on the heap"
is only a rule of thumb, see value-types-reference-types-and-boxing.
SDK and CLI
- File-based apps gain publish support, the
#:projectdirective, runtime path access and better shebang handling. They target Native AOT by default, and#:property PublishAot=falseturns that off. Deep dive:file-based-apps; the AOT side is innative-aot-and-its-limits. - One-shot tools.
dotnet tool execruns a tool without installing it, anddnxis a script that forwards to it. Tools can also ship per-RID packages, including theanyRID for a portable fallback. - Noun-first commands.
dotnet package addanddotnet reference addjoin the old verb-first forms, which still work. - Introspection and shells.
--cli-schemaprints the command tree as JSON, anddotnet completions scriptemits native completion scripts for bash, fish, nushell, PowerShell and zsh. CLI commands are also interactive by default in interactive terminals. - Package pruning. NuGet Audit can prune framework-provided package
references for projects targeting .NET 10 or later, which cuts restore work
and shrinks
deps.jsonfiles. Seenuget-restore-versions-and-dependency-resolutionandassemblies-frameworks-and-the-host-resolver. - Containers and tests. Console apps can create container images with
dotnet publish /t:PublishContainer,ContainerImageFormatselects Docker or OCI, anddotnet testsupports Microsoft.Testing.Platform throughglobal.json. The testing track starts attesting-clean-architecture-with-mstest. - MSBuild tasks.
msbuild.exeand Visual Studio 2026 can run tasks built for .NET. Project files are covered insdk-style-projects-msbuild-and-directory-build-props.
Libraries
- Numeric string ordering.
CompareOptions.NumericOrderingmakes "2" sort before "10". Deep dive:strings-comparison-culture-and-ordering. - System.Text.Json.
AllowDuplicateProperties, theJsonSerializerOptions.Strictpreset,PipeReaderoverloads for deserialization andReferenceHandlerinJsonSourceGenerationOptions. Seesystem-text-json-serialization-and-optionsandsystem-text-json-source-generation-and-utf8jsonreader. - Async ZIP.
ZipArchive.CreateAsync,ZipFile.OpenReadAsyncand related methods avoid blocking threads on archive I/O. Background on streams and pipelines:async-io-and-system-io-pipelines. - Also listed by the libraries page: post-quantum cryptography (ML-DSA,
Composite ML-DSA), AES KeyWrap with Padding,
WebSocketStream, TLS 1.3 for macOS clients, newActivitySourceandMeteroptions, Tensor APIs and Windows process groups. No concept here covers them yet.
Other areas
Aspire, ASP.NET Core, EF Core, Windows Forms, WPF and MAUI each have their own
page. The overview names named query filters as an EF Core 10 feature; they are
explained in global-and-named-query-filters, and JSON columns in
json-columns-and-complex-types.
Trade-offs
- LTS is a policy, not a reason. Moving from 8 to 10 gets you three years of support, but each item above still needs a test. Measure your own workload before attributing speed to JIT gains.
- Defaults change behavior. A file-based app targets Native AOT, so a
package that needs reflection can fail at
dotnet run. The fix is one#:propertyline, but you must know the default exists. - Pruning can surprise. Smaller
deps.jsonfiles are good, yet a script that looked for a framework package in the old file may now find nothing. - A map hides depth. Each bullet here is a headline. The Microsoft pages are the source of truth and keep being edited; this page records what they said when it was written.