Neuerungen in .NET 6

Mit .NET 6 wird der Vereinheitlichungsplan vollständig umgesetzt, der mit .NET 5 begonnen wurde. In .NET 6 werden das SDK, die Basisbibliotheken und die Runtime für mobile Apps, Desktop-, IoT- und Cloud-Apps vereinheitlicht. Zusätzlich zu dieser Vereinheitlichung bietet das .NET 6-Ökosystem Folgendes:

  • Vereinfachte Entwicklung: Der Einstieg ist einfach. Neue Sprachfeatures in C# 10 reduzieren die Codemenge, die Sie schreiben müssen. Die Investitionen in den Webstapel und die minimalistischen APIs erleichtern darüber hinaus das Programmieren kleinerer und schnellerer Microservices.

  • Bessere Leistung: .NET 6 ist das schnellste Full-Stack-Webframework, das bei Ausführungen in der Cloud sogar die Computekosten senkt.

  • Höchste Produktivität: In .NET 6 und Visual Studio 2022 sind Hot Reload, neue Git-Tools, intelligente Codebearbeitung, stabile Diagnose- und Testtools und Features für eine bessere Zusammenarbeit verfügbar.

.NET 6 wird drei Jahre lang als LTS-Release (Long-Term Support) unterstützt.

Vorschaufeatures sind standardmäßig deaktiviert. Sie werden auch nicht für die Verwendung in der Produktion unterstützt und werden in einer zukünftigen Version ggf. entfernt. Die neue Klasse RequiresPreviewFeaturesAttribute wird verwendet, um Vorschau-APIs zu kommentieren, und ein entsprechendes Analyseprogramm warnt Sie, wenn Sie diese Vorschau-APIs verwenden.

.NET 6 wird von Visual Studio 2022 und Visual Studio 2022 für Mac (und höher) unterstützt.

In diesem Artikel werden nicht alle neuen Features von .NET 6 behandelt. Alle neuen Features und weitere Informationen zu den in diesem Artikel aufgeführten Features finden Sie im Blogbeitrag Ankündigung von .NET 6.

Leistung

In .NET 6 wurden zahlreiche Leistungsverbesserungen vorgenommen. In diesem Abschnitt werden einige der Verbesserungen aufgeführt. Ausführliche Informationen finden Sie im Blogbeitrag Leistungsverbesserungen in .NET 6.

FileStream

Der Typ System.IO.FileStream wurde für .NET 6 umgeschrieben, um die Leistung und Zuverlässigkeit unter Windows zu verbessern. Jetzt wird die Klasse FileStream nie blockiert, wenn Sie für asynchrone E/A-Vorgänge unter Windows erstellt wird. Weitere Informationen finden Sie im Blogbeitrag Verbesserungen an Datei-E/A in .NET 6.

Profilgesteuerte Optimierung

Bei der profilgesteuerten Optimierung (PGO) generiert der JIT-Compiler optimierten Code für die am häufigsten verwendeten Typen und Codepfade. Mit .NET 6 wird die dynamische PGO eingeführt. Die dynamische PGO ist eng mit der mehrstufigen Kompilierung verzahnt, um den Code auf Grundlage der zusätzlichen Instrumentierung in Ebene 0 zu weiter zu optimieren. Die dynamische PGO ist standardmäßig deaktiviert, aber Sie können sie mit der Umgebungsvariablen DOTNET_TieredPGO aktivieren. Weitere Informationen finden Sie unter Verbesserungen der JIT-Leistung.

Crossgen2

In .NET 6 wird Crossgen2 eingeführt, der Nachfolger des eingestellten Crossgen-Tools. Crossgen und Crossgen2 sind Tools, die eine AOT-Kompilierung (Ahead-of-Time) ermöglichen, um die Startzeit einer App zu verbessern. Crossgen2 ist nicht in C++, sondern in C# geschrieben und kann Analysen und Optimierungen durchführen, die in der vorherigen Version nicht möglich waren. Weitere Informationen finden Sie in diesem Interview zu Crossgen2.

ARM64-Unterstützung

Das .NET 6-Release unterstützt die Betriebssysteme macOS ARM64 (oder Apple Silicon) und Windows ARM64 sowohl für die native ARM64-Ausführung als auch für die x64-Emulation. Darüber hinaus werden die .NET-Installationsprogramme für x64 und ARM64 jetzt parallel installiert. Weitere Informationen finden Sie unter .NET-Unterstützung für macOS 11 und Windows 11 für ARM64 und x64.

Erneut laden im laufenden Betrieb

Hot Reload ist ein Feature, mit dem Sie den Quellcode Ihrer App bearbeiten und die Änderungen sofort auf Ihre ausgeführte App anwenden können. Der Zweck des Features besteht darin, Ihre Produktivität zu steigern, da App-Neustarts nach Bearbeitungen vermieden werden. Hot Reload ist in Visual Studio 2022 und dem Befehlszeilentool dotnet watch verfügbar. Hot Reload ist mit den meisten .NET-Apps und mit C#-, Visual Basic- und C++-Quellcode kompatibel. Weitere Informationen finden Sie im Blogbeitrag zu Hot Reload.

.NET MAUI

.NET Multi-Platform App UI (.NET MAUI) befindet sich derzeit noch in der Vorschauphase. Ein Release Candidate wird im ersten Quartal 2022 und eine allgemein verfügbare Version im zweiten Quartal 2022 veröffentlicht. Mit .NET MAUI können Sie native Client-Apps für Desktop- und mobile Betriebssysteme mit einer einzigen Codebasis entwickeln. Weitere Informationen finden Sie im Blogbeitrag Update zu .NET Multi-Platform App UI.

C# 10 und Vorlagen

In C# 10 wurden Innovationen wie global using-Anweisungen, dateibezogene Namespacedeklarationen und Datensatzstrukturen eingeführt. Weitere Informationen finden Sie unter Neuerungen in C# 10.

Auch die .NET SDK-Projektvorlagen für C# wurden modernisiert, sodass diese nun einige der neuen Sprachfeatures verwenden können:

Da diese neuen Sprachfeatures zu den Projektvorlagen hinzugefügt wurden, sind sie bei neuem Code bereits aktiviert. Auf bestehenden Code werden sie jedoch nicht angewendet, wenn Sie ein Upgrade auf .NET 6 durchführen. Weitere Informationen zu diesen Vorlagenänderungen finden Sie im Blogbeitrag .NET SDK: Modernisierte C#-Projektvorlagen.

F# und Visual Basic

In F# 6 wurden einige Verbesserungen an F# und F# Interactive vorgenommen. Weitere Informationen finden Sie unter Neuerungen in F# 6.

Für Visual Basic wurden Verbesserungen in Visual Studio und beim Windows Forms-Projektstart vorgenommen.

SDK-Workloads

Um das .NET SDK kleiner zu halten, wurden einige Komponenten in neuen, optionalen SDK-Workloads untergebracht. Zu diesen Komponenten gehören .NET MAUI und Blazor WebAssembly AOT. Wenn Sie Visual Studio verwenden, werden alle benötigten SDK-Workloads automatisch installiert. Wenn Sie die .NET-CLIverwenden, können Sie Workloads mit den neuen dotnet workload-Befehlen verwalten:

Befehl BESCHREIBUNG
dotnet workload search Sucht nach verfügbaren Workloads
dotnet workload install Installiert eine angegebene Workload
dotnet workload uninstall Entfernt eine angegebene Workload
dotnet workload update Aktualisiert installierte Workloads
dotnet workload repair Installiert alle installierten Workloads neu, um eine fehlerhafte Installation zu reparieren
dotnet workload list Listet installierte Workloads auf

Weitere Informationen finden Sie unter Optionale SDK-Workloads.

System.Text.Json-APIs

An System.Text.Json wurden in .NET 6 viele Verbesserungen vorgenommen, sodass es sich jetzt um eine branchentaugliche Serialisierungslösung handelt.

Quell-Generator

In .NET 6 wurde ein neuer Quell-Generator für System.Text.Json hinzugefügt. Die Quellgenerierung verwendet JsonSerializer und kann auf verschiedene Weise konfiguriert werden. Sie kann die Leistung verbessern, die Arbeitsspeicherauslastung reduzieren und das Kürzen von Assemblys vereinfachen. Weitere Informationen finden Sie unter Tipps zur Auswahl zwischen der Reflexion und der Quellgenerierung in System.Text.Json und Verwenden der Quellgenerierung in System.Text.Json.

Beschreibbares DOM

Ein neues, beschreibbares Dokumentobjektmodell (DOM) wurde hinzugefügt, das das vorhandene schreibgeschützte DOM ergänzt. Die neue API stellt eine schlanke Serialisierungsalternative für Fälle dar, in denen die Verwendung von Plain Old CLR Object-Typen (POCO) nicht möglich ist. Außerdem können Sie effizient zu einem Unterabschnitt einer großen JSON-Struktur navigieren und ein Array lesen oder ein POCO aus diesem Unterabschnitt deserialisieren. Die folgenden neuen Typen wurden hinzugefügt, um das beschreibbare DOM zu unterstützen:

Weitere Informationen finden Sie unter JSON-Optionen für DOMs.

IAsyncEnumerable-Serialisierung

System.Text.Json unterstützt jetzt die Serialisierung und Deserialisierung mit IAsyncEnumerable<T>-Instanzen. Asynchrone Serialisierungsmethoden enumerieren alle IAsyncEnumerable<T>-Instanzen in einem Objektgraphen und serialisieren sie dann als JSON-Arrays. Für die Deserialisierung wurde die neue Methode JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) hinzugefügt. Weitere Informationen finden Sie unter IAsyncEnumerable-Serialisierung.

Weitere neue APIs

Neue Serialisierungsschnittstellen für Validierungs- und Standardwerte:

Weitere Informationen finden Sie unter Rückrufe.

Neues Attribut für die Sortierung von Eigenschaften:

Neue Methode zum Schreiben von unformatiertem JSON-Code:

Synchrone Serialisierung und Deserialisierung in einen Stream:

Neue Option zum Ignorieren eines Objekts, wenn während der Serialisierung ein Zirkelbezug erkannt wird:

Weitere Informationen zum Serialisieren und Deserialisieren mit System.Text.Json finden Sie unter JSON-Serialisierung und -Deserialisierung in .NET.

HTTP/3

.NET 6 unterstützt die Vorschauversion von HTTP/3, eine neue Version von HTTP. HTTP/3 löst einige vorhandene Funktions- und Leistungsprobleme, indem ein neues zugrunde liegendes Verbindungsprotokolls namens QUIC eingeführt wird. QUIC stellt Verbindungen schneller ein, und Verbindungen sind unabhängig von der IP-Adresse, sodass mobile Clients zwischen WLAN und Mobilfunknetzwerken roamen können. Weitere Informationen finden Sie unter Verwenden von HTTP/3 mit HttpClient.

ASP.NET Core

In ASP.NET Core wurden Verbesserungen an den minimalistischen APIs, der AOT-Kompilierung (Ahead-of-Time) für Blazor WebAssembly-Apps und Single-Page-Apps vorgenommen. Darüber hinaus können Blazor-Komponenten jetzt aus JavaScript gerendert und mit vorhandenen JavaScript-basierten Apps integriert werden. Weitere Informationen finden Sie unter Neues bei ASP.NET Core 6.

OpenTelemetry

.NET 6 bietet eine verbesserte Unterstützung für OpenTelemetry. Dabei handelt es sich um eine Sammlung von Tools, APIs und SDKs, mit denen Sie die Leistung und das Verhalten Ihrer Software analysieren können. APIs im Namespace System.Diagnostics.Metrics implementieren die OpenTelemetry Metrics-API-Spezifikation. Beispielsweise gibt es vier Instrumentklassen für unterschiedliche Metrikszenarios. Die Instrumentklassen sind:

Sicherheit

.NET 6 unterstützt zwei neue Ansätze zur Entschärfung von Sicherheitsrisiken als Vorschauversion: Control-Flow Enforcement Technology (CET) und Write Exclusive Execute (W^X).

CET ist eine Intel-Technologie, die in einigen neueren Intel- und AMD-Prozessoren verfügbar ist. Sie ergänzt die Hardware mit Schutzmechanismen gegen Control-Flow-Hijacking-Angriffe. .NET 6 unterstützt CET für Windows x64-Apps, und die Funktion muss explizit aktiviert werden. Weitere Informationen finden Sie unter .NET 6-Kompatibilität mit Intel CET-Schattenstapeln.

W^X ist für alle Betriebssysteme mit .NET 6 verfügbar, aber nur standardmäßig auf Apple Silicon aktiviert. W^X blockiert den einfachsten Angriffspfad, indem verhindert wird, dass Speicherseiten gleichzeitig beschreibbar und ausführbar sind.

IL-Kürzung

Das Kürzen eigenständiger Bereitstellungen wurde verbessert. In .NET 5 wurden nur nicht verwendete Assemblys gekürzt. Ab .NET 6 können auch nicht verwendete Typen und Member gekürzt werden. Außerdem sind Kürzungswarnungen jetzt standardmäßig aktiviert. Diese weisen Sie auf Kürzungen hin, bei denen Code entfernt wird, der zur Laufzeit verwendet wird. Weitere Informationen finden Sie unter Kürzen eigenständiger Bereitstellungen und ausführbarer Dateien.

Codeanalyse

Das .NET 6 SDK enthält neue Codeanalysetools für die API-Kompatibilität, die Plattformkompatibilität, die Kürzungssicherheit, die Verwendung von span bei der Zeichenfolgenverkettung und -teilung, schnellere Zeichenfolgen-APIs und schnellere Sammlungs-APIs. Eine vollständige Liste der neuen (und entfernten) Analysetools finden Sie unter Analysetools in .NET 6.

Benutzerdefinierte Plattformwächter

Das Analysetool für Plattformkompatibilität erkennt die Is<Platform>-Methoden in der Klasse OperatingSystem, zum Beispiel OperatingSystem.IsWindows(), als Plattformwächter. Damit benutzerdefinierte Plattformwächter verwendet werden können, wurden in .NET 6 zwei neue Attribute eingeführt, die Sie für die Kommentierung von Feldern, Eigenschaften oder Methoden mit einem unterstützten oder nicht unterstützten Plattformnamen verwenden können:

Windows Forms

Application.SetDefaultFont(Font) ist eine neue Methode in .NET 6, mit der die Standardschriftart für Ihre Anwendung festgelegt wird.

Die Vorlagen für in C# geschriebene Windows Forms-Apps wurden aktualisiert, damit global using-Anweisungen, dateibezogene Namespaces und Nullable-Verweistypen unterstützt werden. Darüber hinaus enthalten sie Bootstrap-Anwendungscode, der Codebausteine reduziert und es dem Windows Forms-Designer ermöglicht, die Entwurfsoberfläche in der bevorzugten Schriftart zu rendern. Der Bootstrapcode ist ein Aufruf von ApplicationConfiguration.Initialize(). Dabei handelt es sich um eine von der Quelle generierte Methode, die Aufrufe an andere Konfigurationsmethoden wie Application.EnableVisualStyles() ausgibt. Wenn Sie über die MSBuild-Eigenschaft ApplicationDefaultFont eine vom Standard abweichende Schriftart festlegen, gibt ApplicationConfiguration.Initialize() außerdem einen Aufruf an SetDefaultFont(Font) aus.

Weitere Informationen finden Sie im Blogbeitrag Neuerungen in Windows Forms.

Quellbuild

Der Quelltarball, der alle Quellobjekte für das .NET SDK enthält, ist jetzt ein Produkt des .NET SDK-Build. Andere Organisationen wie Red Hat können dann mithilfe dieses Quelltarballs eigene Versionen dieses SDK erstellen.

Zielframeworkmoniker

Es wurden weitere betriebssystemspezifische Zielframeworkmoniker (TFMs) zu .NET 6 hinzugefügt, zum Beispiel net6.0-android, net6.0-ios und net6.0-macos. Weitere Informationen finden Sie unter Betriebssystemspezifische TFMs für .NET 5 und höher.

Generische Mathematik

Die Verwendung von Operatoren in generischen Typen ist in .NET 6 jetzt als Vorschauversion verfügbar. In .NET 6 wurden zahlreiche Schnittstellen eingeführt, die das neue Vorschaufeature von C# 10 verwendet, static abstract-Schnittstellenmember. Diese Schnittstellen entsprechen verschiedenen Operatoren, z. B. stellt IAdditionOperators den Operator + dar. Diese Schnittstellen sind im NuGet-Paket System.Runtime.Experimental enthalten. Weitere Informationen finden Sie im Blogbeitrag Generische Mathematik.

NuGet-Paketvalidierung

NuGet-Bibliotheksentwickler*innen können mit dem neuen Paketvalidierungstool überprüfen, ob ihre Pakete konsistent und gut formatiert sind. Sie können Folgendes herausfinden:

  • Ob es Breaking Changes zwischen Paketversionen gibt
  • Ob das Paket die gleichen öffentlichen APIs für alle runtimespezifischen Implementierungen verwendet
  • Ob es Lücken bei der Anwendbarkeit des Zielframeworks oder der Runtime gibt

Weitere Informationen finden Sie im Blogbeitrag Paketvalidierung.

Reflexions-APIs

In .NET 6 werden die folgenden neuen APIs eingeführt, die Code überprüfen und Informationen zur NULL-Zulässigkeit bereitstellen:

Diese APIs sind für reflexionsbasierte Tools und Serialisierungsmodule nützlich.

Microsoft.Extensions-APIs

In .NET 6 wurden an mehreren Erweiterungsnamespaces Verbesserungen vorgenommen. Diese werden in der folgenden Tabelle aufgeführt.

Namespace Verbesserungen
Microsoft.Extensions.DependencyInjection CreateAsyncScope ermöglicht die sichere Verwendung einer using-Anweisung für einen Dienstanbieter, der einen IAsyncDisposable-Dienst registriert.
Microsoft.Extensions.Hosting Die neuen ConfigureHostOptions-Methoden vereinfachen die Anwendungseinrichtung.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging verfügt über einen neuen Quell-Generator für leistungsstarke Protokollierungs-APIs. Der Quell-Generator wird ausgelöst, wenn Sie die neue Klasse LoggerMessageAttribute einer partial-Protokollierungsmethode hinzufügen. Zur Kompilierzeit generiert der Generator die Implementierung der partial-Methode, die in der Regel zur Laufzeit schneller als vorhandene Protokollierungslösungen ist. Weitere Informationen finden Sie unter Quellgenerierung zur Kompilierzeitprotokollierung.

Neue LINQ-APIs

In .NET 6 wurden zahlreiche LINQ-Methoden hinzugefügt. Für die meisten in der folgenden Tabelle aufgeführten Methoden gibt es äquivalente Methoden im System.Linq.Queryable-Typ.

Methode BESCHREIBUNG
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Diese Methode versucht, die Anzahl der Elemente in einer Sequenz zu bestimmen, ohne eine Enumeration zu erzwingen.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Diese Methode teilt die Elemente einer Sequenz in Teile mit einer festgelegten Größe auf.
Enumerable.MaxBy und Enumerable.MinBy Diese Methode sucht mithilfe eines Schlüsselselektors nach maximalen oder minimalen Elementen.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectBy und Enumerable.UnionBy Mit diesen neuen Varianten der Methoden, die setbasierte Vorgänge ausführen, können Sie Gleichheit mithilfe einer Schlüsselselektorfunktion angeben.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) und Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Diese Methode akzeptiert Indizes, die vom Anfang oder Ende der Sequenz gezählt werden: Enumerable.Range(1, 10).ElementAt(^2) gibt beispielsweise 9 zurück.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) und Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) und Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) und Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Mit neuen Überladungen können Sie einen Standardwert angeben, der verwendet werden soll, wenn die Sequenz leer ist.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) und Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) Mit neuen Überladungen können Sie einen Comparer angeben.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Diese Methode akzeptiert ein Range-Argument, um das Erstellen eines Slices aus einer Sequenz zu vereinfachen. Beispielsweise können Sie source.Take(2..7) anstelle von source.Take(7).Skip(2) verwenden.
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) Diese Methode erzeugt eine Tupelsequenz mit Elementen aus drei angegebenen Sequenzen.

Verbesserungen an Datumsangaben, Uhrzeiten und Zeitzonen

In .NET 6 wurden die beiden Strukturen System.DateOnly und System.TimeOnly hinzugefügt. Diese stellen den Datums- bzw. den Uhrzeitteil einer DateTime-Struktur dar. DateOnly eignet sich für Geburtstage und Jubiläen, während TimeOnly für tägliche Wecker und wöchentliche Geschäftszeiten nützlich ist.

Sie können jetzt entweder die IANA-Zeitzonen (Internet Assigned Numbers Authority) oder die Windows-Zeitzonen-IDs auf jedem Betriebssystem verwenden, auf dem Zeitzonendaten installiert sind. Die TimeZoneInfo.FindSystemTimeZoneById(String)-Methode wurde aktualisiert und konvertiert die Eingabe automatisch von einer Windows-Zeitzone in eine IANA-Zeitzone (oder umgekehrt), wenn die angeforderte Zeitzone im System nicht gefunden wird. Die neuen Methoden TryConvertIanaIdToWindowsId(String, String) und TryConvertWindowsIdToIanaId wurden zudem für Szenarios hinzugefügt, in denen Sie immer noch manuell ein Zeitzonenformat in ein anderes konvertieren müssen.

Darüber hinaus wurden weitere Verbesserungen an Zeitzonen vorgenommen. Weitere Informationen finden Sie unter Verbesserungen an Datumsangaben, Uhrzeiten und Zeitzonen in .NET 6.

PriorityQueue-Klasse

Die neue Klasse PriorityQueue<TElement,TPriority> ist eine Sammlung aus Elementen, die über einen Wert und über eine Priorität verfügen. Die Elemente werden nach absteigender Priorität aus der Warteschlange entfernt. Das bedeutet, dass das Element mit dem niedrigsten Prioritätswert zuerst entfernt wird. Diese Klasse implementiert eine min heap-Datenstruktur.

Weitere Informationen