Die .NET-Release-Kadenz beschleunigt sich weiter
Microsoft veröffentlichte .NET 9 im November 2024 als Standard-Term-Support-Release (STS), und das Verbesserungstempo zeigt keine Anzeichen einer Verlangsamung. Mit über 7,500 Pull Requests, die allein in das Repository dotnet/runtime eingeflossen sind, ist .NET 9 das schnellste und leistungsfähigste Release der Plattform bisher.
Doch "am schnellsten" ist abstrakt. Als Entwickler müssen wir wissen: Was hat sich tatsächlich geändert, was macht unseren Code besser, und lohnt sich das Upgrade?
Dieser Leitfaden schlüsselt jede bedeutsame Verbesserung von .NET 8 zu .NET 9 auf – von den Sprachfeatures in C# 13 über Performance-Gewinne zur Laufzeit und AI-Integration bis hin zu Erweiterungen in ASP.NET Core –, damit Sie eine fundierte Entscheidung für Ihr Team treffen können.
C# 13: Sprachfeatures, die Sie wirklich nutzen werden
C# 13 wird mit dem .NET 9 SDK ausgeliefert und führt mehrere Features ein, die Boilerplate reduzieren und die Sicherheit verbessern:
params-Collections
Bisher war params auf Arrays beschränkt. C# 13 erweitert die Unterstützung von params auf jeden Auflistungstyp, der IEnumerable<T> implementiert und über eine Add-Methode verfügt – einschliesslich List<T>, Span<T> und ReadOnlySpan<T>. Das beseitigt unnötige Array-Allokationen beim Aufruf von Methoden mit variabler Argumentanzahl.
Neuer Lock-Typ und neue Semantik
Der Typ System.Threading.Lock ersetzt das traditionelle Muster lock (obj) { } durch einen dedizierten Typ, den der Compiler erkennt. Das neue Schlüsselwort lock arbeitet mit Lock-Objekten zusammen, um effizienteren Code mit verbesserter Debugging-Unterstützung zu erzeugen.
ref struct-Schnittstellen
ref struct-Typen können nun Schnittstellen implementieren und als Typargumente in Generics verwendet werden. Das ermöglicht Muster wie hochperformante span-basierte Abstraktionen, die zuvor aufgrund von Typeinschränkungen unmöglich waren.
Partielle Eigenschaften und Indexer
Partielle Eigenschaften und Indexer sind nun in partiellen Typen erlaubt, was Source-Generatoren ausdrucksstärker macht. Bibliotheksautoren können partielle Eigenschaften in generiertem Code deklarieren, während die Implementierungen im Benutzercode liegen – ein Muster, das von Source-Generatoren getriebene Architekturen erheblich vereinfacht.
Priorität der Überladungsauflösung
Bibliotheksautoren können nun mit dem Attribut [OverloadResolutionPriority] eine Überladung als besser als andere kennzeichnen. Das beseitigt Compilerfehler wegen mehrdeutiger Aufrufe, wenn bestehenden APIs neue Überladungen hinzugefügt werden, ohne dass Konsumenten beeinträchtigt werden.
Impliziter Indexer-Zugriff in Objektinitialisierern
Sie können nun den Operator ^ (Index vom Ende) in Objektinitialisierern verwenden, was die Initialisierung von Auflistungen ausdrucksstärker macht, wenn Sie vom Ende einer Sequenz her befüllen.
Laufzeit-Performance: Jeder Zyklus zählt
Die Performance-Geschichte von .NET 9 basiert auf Hunderten gezielter Verbesserungen, die sich in realen Anwendungen summieren. Hier sind die Highlights:
Dynamisches PGO: Optimiert jetzt Casts und Verzweigungen
Die dynamische profilgeführte Optimierung (PGO) – eingeführt in .NET 8 – geht nun über den virtuellen Dispatch hinaus und umfasst auch Cast-Optimierungen. Der JIT verfolgt die häufigsten Typen, die bei obj is T- und (T)obj-Operationen auftreten, und generiert dann schnelle Pfade für diese Typen. In Mikro-Benchmarks laufen Typprüfungsoperationen auf gängigen Pfaden bis zu 4-mal schneller.
Schleifenoptimierungen: Strength Reduction und abwärts zählende Schleifen
Der JIT führt nun Strength Reduction bei Array-Iterationsschleifen durch und wandelt indexbasierten Zugriff in Zeigerarithmetik um. In Kombination mit automatischem Abwärtszählen (das cmp + jl durch ein einzelnes jns ersetzt) sparen enge Schleifen eine Instruktion pro Iteration. Bei Hot-Path-Schleifen über grosse Auflistungen summiert sich das rasch.
Eliminierung von Bereichsprüfungen: Intelligenter als je zuvor
Die Bereichsprüfungsanalyse des JIT behandelt nun zuvor übersehene Muster – umgekehrte Indexierung, komplexe Schleifenbedingungen und span-basierte Zugriffe, die mit früheren Längenprüfungen zusammenwirken. Weniger Bereichsprüfungen bedeuten engere Schleifen und weniger Verzweigungen, die falsch vorhergesagt werden können.
Garbage Collection: Dynamische Anpassung
Der Server-GC umfasst nun eine dynamische Anpassung an die Anwendungsgrösse, die standardmässig aktiviert ist. Der GC passt sein Verhalten anhand der tatsächlichen Speichermuster der Anwendung an, statt anhand fester Heuristiken, und reduziert so die Pausenzeiten für speicherintensive Workloads, ohne den Durchsatz zu beeinträchtigen.
Vektorisierung und Arm64
Der Arm64-Codegenerierung wurde erhebliche Aufmerksamkeit gewidmet, mit erweiterter SIMD-Vektorisierung und besserer Nutzung Arm-spezifischer Instruktionen. Für Cloud-Workloads, die auf Graviton- oder Ampere-Prozessoren laufen, führt dies direkt zu geringeren Rechenkosten.
ASP.NET Core 9: Standardmässig sicher, von Grund auf schneller
ASP.NET Core 9 macht Sicherheitsverbesserungen automatisch und hebt gleichzeitig die Performance-Obergrenze an:
Integrierte OpenAPI-Dokumentgenerierung
Das neue Paket Microsoft.AspNetCore.OpenApi bietet eine integrierte OpenAPI-Dokumentgenerierung, ohne dass Swashbuckle oder NSwag erforderlich sind. Metadaten aus Minimal-APIs, Controllern und Typannotationen werden automatisch in den generierten OpenAPI-Spezifikationen berücksichtigt – was die Abhängigkeitsfluktuation reduziert und die Kompatibilität verbessert.
Fingerprinting statischer Assets
Die Optimierung statischer Dateien (JavaScript, CSS) zur Build- und Publish-Zeit umfasst nun eine automatische, mit Fingerprint versehene Versionierung. Cache-Busting geschieht automatisch und beseitigt eine häufige Ursache für Fehler durch veraltete Assets.
Blazor-Verbesserungen
Neue Hybrid- und Web-App-Vorlagen vereinfachen die Projekteinrichtung. Die Erkennung des Rendermodus von Komponenten verbessert das Debugging. Das Wiederverbindungserlebnis für Blazor Server wurde neu gestaltet und bietet Nutzern ein reibungsloseres Erlebnis, wenn Netzwerkverbindungen abbrechen.
Erweiterung von Native AOT
Die Unterstützung für Ahead-of-Time-Kompilierung in ASP.NET Core wurde erweitert, was die Kaltstart-Latenz und den Speicherbedarf reduziert. Für containerisierte Microservices bedeutet Native AOT kleinere Images und schnellere Scale-out-Vorgänge.
HTTPS-Entwicklungszertifikat für Linux
Das Einrichten eines vertrauenswürdigen Entwicklungszertifikats unter Linux für HTTPS während der Entwicklung ist nun deutlich einfacher – eine Komfortverbesserung für Teams, die auf Linux-Arbeitsstationen entwickeln.
AI-Bausteine: .NET wird nativ mit AI
.NET 9 führt eine einheitliche AI-Abstraktionsschicht ein und positioniert .NET als erstklassige Plattform für AI-gestützte Anwendungen:
Microsoft.Extensions.AI
Eine Sammlung von C#-Abstraktionen für die Interaktion mit AI-Diensten – kleinen und grossen Sprachmodellen (SLMs und LLMs), Embeddings und Vektorspeichern. Diese Pakete bieten ein einheitliches Programmiermodell, egal ob Sie OpenAI, Azure OpenAI oder lokale Modelle über ONNX Runtime aufrufen.
Tensor<T> und TensorPrimitives
Der neue Typ Tensor<T> ermöglicht eine effiziente mehrdimensionale Datenmanipulation mit Zero-Copy-Interop zu ML.NET, TorchSharp und ONNX Runtime. TensorPrimitives wurde von 40 auf nahezu 200 SIMD-optimierte Operationen erweitert – und deckt damit die numerischen Primitive ab, die für Inferenz und Feature Engineering benötigt werden.
ML.NET 4.0
ML.NET 4.0 bringt das Laden von ONNX-Modellen als Stream, neue Tokenizer-Unterstützung für GPT-, Llama-, Phi- und Bert-Modelle sowie experimentelle TorchSharp-Portierungen der Modellfamilien Llama und Phi. Wenn Sie .NET-Anwendungen entwickeln, die AI-Inferenz auf dem Gerät oder im Prozess benötigen, ist dies das Release, das dies praktikabel macht.
Tokenizer-Bibliothek
Die Bibliothek Microsoft.ML.Tokenizers unterstützt nun Tiktoken (GPT-3/4/4o/o1), Llama, CodeGen, Phi2 und Bert-Tokenizer von Haus aus. Das ist unerlässlich, um Kontextfenster zu verwalten, Token-Kosten zu berechnen und Text für lokale Modelle vorzuverarbeiten.
EF Core 9: Cosmos DB und vorkompilierte Abfragen
Entity Framework Core 9 konzentriert sich auf zwei Bereiche: eine tiefere Integration von Azure Cosmos DB for NoSQL und die Grundlagen für die Ahead-of-Time-Kompilierung:
- Cosmos DB-Provider: Bedeutende Aktualisierungen für den NoSQL-Provider, darunter verbesserte LINQ-Übersetzung, Unterstützung für hierarchische Partitionsschlüssel und besseres Durchsatzmanagement.
- Vorkompilierte Abfragen: Schritte hin zu AOT-kompilierten Abfragen, die den Overhead der Abfragekompilierung zur Laufzeit beseitigen – entscheidend für die Kaltstart-Performance in serverlosen und containerisierten Umgebungen.
- Verbesserungen bei komplexen Typen: Besserer Umgang mit Owned Entities und Value Objects, was die für reichhaltige Domänenmodelle nötige Boilerplate reduziert.
.NET MAUI: Performance und Desktop-Integration
.NET MAUI in .NET 9 priorisiert Performance und Desktop-Funktionen:
- CollectionView und CarouselView erhielten neue, performantere Implementierungen unter iOS und Mac Catalyst.
- HybridWebView ermöglicht das einfachere Einbetten von React-, Vue.js- oder Angular-Inhalten in MAUI-Apps.
- TitleBar-Steuerelement für Windows-Desktopanwendungen, das eine native Anpassung der Titelleiste ermöglicht.
- Native AOT- und Trimming-Verbesserungen reduzieren die App-Grösse und die Startzeit auf Mobilgeräten.
.NET 8 vs. .NET 9: Direkter Vergleich
| Kategorie | .NET 8 | .NET 9 |
|---|---|---|
| Release-Typ | LTS (3 Jahre Support) | STS (2 Jahre Support) |
| C#-Version | C# 12 | C# 13 |
| Dynamisches PGO | Virtueller/Interface-Dispatch | Ergänzt Casts, Verzweigungen, Integer-Profiling |
| AI-Abstraktionen | Keine (nur NuGet-Pakete) | Microsoft.Extensions.AI, Tensor<T> |
| OpenAPI | Drittanbieter (Swashbuckle) | Integriert Microsoft.AspNetCore.OpenApi |
| GC-Modus | Feste Server-/Workstation-Einstellung | Dynamische Anpassung an die App-Grösse |
| ref struct | Kann keine Schnittstellen implementieren | Kann Schnittstellen implementieren, als generische Argumente verwendet |
| Schleifenoptimierungen | Grundlegende Schleifenerkennung | Strength Reduction, abwärts zählend |
| LINQ | Standardoperatoren | Ergänzt CountBy, AggregateBy |
| Native AOT | Eingeschränkte ASP.NET-Unterstützung | Erweiterte ASP.NET-Unterstützung |
Sollten Sie upgraden?
Upgraden Sie sofort, wenn:
- Sie performancekritische Workloads betreiben und von den JIT-, GC- und Schleifenoptimierungen profitieren können.
- Sie AI-gestützte Funktionen entwickeln – allein die neuen
Microsoft.Extensions.AI-Abstraktionen und die Tokenizer-Unterstützung sind die Migration wert. - Sie auf Arm64 (Graviton, Ampere) bereitstellen – die Verbesserungen bei der Arm64-Codegenerierung senken direkt die Cloud-Kosten.
- Sie NuGet-Bibliotheken pflegen – C# 13-Features wie
[OverloadResolutionPriority]und partielle Eigenschaften verbessern das Erstellen von Bibliotheken.
Berücksichtigen Sie den Zeitplan, wenn:
- Sie LTS-Support benötigen – .NET 8 wird bis November 2027 unterstützt. Wenn Ihre Organisation aus Compliance-Gründen LTS benötigt, planen Sie stattdessen Ihre Migration auf .NET 10 (LTS) und setzen Sie .NET 9 für neue Projekte ein.
- Sie von Drittanbieter-Paketen abhängig sind, die noch keine .NET 9-Ziele hinzugefügt haben – prüfen Sie vor der Migration, ob Ihre kritischen Abhängigkeiten
net9.0unterstützen.
Für nopCommerce- und Umbraco-Nutzer:
- nopCommerce 4.90 zielt nativ auf .NET 9 – wenn Sie 4.80 oder älter verwenden, erhalten Sie mit dem Upgrade auf 4.90 alle diese Verbesserungen automatisch.
- Umbraco 14+ läuft auf .NET 9 – alle über 20 Umbraco-Plugins von SplatDev wurden migriert und auf .NET 9-Kompatibilität getestet.
Upgrade-Pfad: Eine praktische Checkliste
- .NET 9 SDK installieren: Herunterladen von dotnet.microsoft.com.
- Zielframework aktualisieren: Ändern Sie
<TargetFramework>net8.0</TargetFramework>in<TargetFramework>net9.0</TargetFramework>in allen .csproj-Dateien. - Paketverweise aktualisieren: Aktualisieren Sie alle NuGet-Pakete auf ihre neuesten Versionen, die .NET 9 unterstützen.
- Breaking Changes angehen: Sehen Sie sich die offizielle Liste der Breaking Changes an – die betroffene Fläche ist bei den meisten Anwendungen gering.
- Neue Features aktivieren: Setzen Sie
<LangVersion>13</LangVersion>, um C# 13-Features zu nutzen. - Testsuite ausführen: Vollständige Regression über Unit-, Integrations- und E2E-Tests.
- Vorher/Nachher benchmarken: Verwenden Sie BenchmarkDotNet, um die Performance-Verbesserungen in Ihrer spezifischen Workload zu quantifizieren.
Das Fazit
.NET 9 ist kein schlagzeilenträchtiges, revolutionäres Release. Es ist die Art von Release, die im Stillen alles besser macht – Ihre Schleifen laufen mit weniger Instruktionen, Ihre Typprüfungen treffen schnelle Pfade, Ihr GC passt sich Ihrer Anwendung an, und Ihre API-Spezifikationen werden automatisch generiert. Diese Verbesserungen summieren sich über jede HTTP-Anfrage, jede Datenbankabfrage, jeden Blazor-Render-Zyklus.
Für Teams, die noch auf .NET 6 oder .NET 7 sind, ist der kumulierte Unterschied von .NET 6 zu .NET 9 dramatisch – Performance-Gewinne von 20-40 % bei gängigen Workloads, eine modernisierte C#-Sprache, integrierte AI-Integration und eine containeroptimierte Laufzeit.
Bei SplatDev bauen wir seit Version 1.0 im Jahr 2009 auf .NET. Wir haben erlebt, wie sich die Plattform von reinem Windows zu echter Plattformunabhängigkeit, von Closed Source zu vollständig offen, von reinem Enterprise-Einsatz zu Cloud-nativ entwickelt hat. .NET 9 ist die leistungsfähigste Version der Plattform, mit der wir je gearbeitet haben – und wir setzen bereits Produktions-Workloads darauf ein.
Bereit, Ihren .NET-Stack zu aktualisieren? SplatDev bietet .NET-Migrationsdienstleistungen, Performance-Optimierung und Full-Stack-Entwicklung – von nopCommerce und Umbraco bis hin zu massgeschneiderten Enterprise-Anwendungen.
Sprechen Sie mit unserem .NET-Team
Oder kontaktieren Sie uns direkt: [email protected]