Freigeben über


Neuerungen in .NET 6

.NET 6 liefert die endgültigen Teile des .NET-Einigungsplans, der mit .NET 5begonnen hat. .NET 6 vereint das SDK, Die Basisbibliotheken und die Laufzeit für mobile, Desktop-, IoT- und Cloud-Apps. Zusätzlich zu dieser Vereinigung bietet das .NET 6-Ökosystem Folgendes:

  • Vereinfachte Entwicklung: Die ersten Schritte sind einfach. Neue Sprachfunktionen in C# 10 verringern die Menge an Code, den Sie schreiben müssen. Und Investitionen in den Webstapel und minimale APIs machen es einfach, kleinere, schnellere Microservices schnell zu schreiben.

  • Bessere Leistung: .NET 6 ist das schnellste Full-Stack-Webframework, das die Rechenkosten senkt, wenn Sie in der Cloud arbeiten.

  • Ultimative Produktivität: .NET 6 und Visual Studio 2022 bieten Hot-Reload, neue Git-Tools, intelligente Code-Editierung, robuste Diagnose- und Testwerkzeuge sowie bessere Teamzusammenarbeit.

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

Vorschaufunktionen sind standardmäßig deaktiviert. Sie werden auch nicht für die Verwendung in der Produktion unterstützt und können in einer zukünftigen Version entfernt werden. 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 höheren Versionen 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

.NET 6 enthält zahlreiche Leistungsverbesserungen. In diesem Abschnitt werden einige der Verbesserungen in FileStream, der profilgesteuerten Optimierung und der AOT-Kompilierung aufgeführt. Ausführliche Informationen finden Sie im Blogbeitrag Leistungsverbesserungen in .NET 6.

FileStream

Der System.IO.FileStream Typ wurde für .NET 6 umgeschrieben, um eine bessere Leistung und Zuverlässigkeit unter Windows zu gewährleisten. 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

Profilgeführte Optimierung (PGO) ist der Ort, an dem der JIT-Compiler optimierte Code in Bezug auf die Typen und Codepfade generiert, die am häufigsten verwendet werden. 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. Dynamisches PGO ist standardmäßig deaktiviert. Sie können es jedoch mit der Umgebungsvariable DOTNET_TieredPGOaktivieren. Weitere Informationen finden Sie unter Verbesserungen der JIT-Leistung.

Crossgen2

.NET 6 führt Crossgen2, den Nachfolger von Crossgen, ein, der entfernt wurde. Crossgen und Crossgen2 sind Tools, die eine AOT-Kompilierung (Ahead-of-Time) ermöglichen, um die Startzeit einer App zu verbessern. Crossgen2 ist in C# anstelle von C++ geschrieben und kann Analysen und Optimierungen durchführen, die mit der vorherigen Version nicht möglich waren. Weitere Informationen finden Sie in diesem Interview zu Crossgen2.

Arm64-Unterstützung

Die .NET 6-Version enthält Unterstützung für macOS Arm64 (oder "Apple Silicon") und Windows Arm64-Betriebssysteme, sowohl für native Arm64-Ausführung als auch für 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 ändern und diese Änderungen sofort auf Ihre ausgeführte App anwenden können. Der Zweck des Features besteht darin, Ihre Produktivität zu steigern, indem App-Neustarts zwischen Bearbeitungen vermieden werden. Hot Reload ist in Visual Studio 2022 und dem Befehlszeilentool dotnet watch verfügbar. Hot Reload funktioniert mit den meisten Typen von .NET-Apps sowie für C#-, Visual Basic- und C++-Quellcode. 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. .NET MAUI ermöglicht es, systemeigene Client-Apps für Desktop- und mobile Betriebssysteme mit einer einzigen Codebasis zu erstellen. 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 C#-Sprachen-Versionsverlauf.

In Abstimmung mit dieser Arbeit wurden die .NET SDK-Projektvorlagen für C# modernisiert, um einige der neuen Sprachfeatures zu verwenden:

Durch Hinzufügen dieser neuen Sprachfunktionen zu den Projektvorlagen beginnt neuer Code mit aktivierten Funktionen. Der vorhandene Code ist jedoch nicht betroffen, 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

F# 6 fügt der F#-Sprache und dem F# Interactive mehrere Verbesserungen hinzu. Weitere Informationen finden Sie unter Neuerungen in F# 6.

Visual Basic bietet Verbesserungen in der Visual Studio-Erfahrung und beim Start von Windows Forms-Projekten.

SDK-Workloads

Um die Größe des .NET SDK kleiner zu halten, wurden einige Komponenten in neuen, optionalen SDK-Workloadsplatziert. Zu diesen Komponenten gehören .NET MAUI und Blazor WebAssembly AOT. Wenn Sie Visual Studio verwenden, kümmert sich die Software um die Installation aller benötigten SDK-Workloads. Wenn Sie die .NET CLI-verwenden, 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

.NET 6 fügt einen neuen Quellgenerator für System.Text.Jsonhinzu. Die Quellgenerierung funktioniert mit JsonSerializer und kann auf mehrere Arten 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.

Schreibbares 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 schreibbare 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 Objektdiagramm 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.

Andere 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 Verweiszyklus erkannt wird:

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

HTTP/3

.NET 6 enthält Vorschauunterstützung für HTTP/3, eine neue Version von HTTP. HTTP/3 löst einige vorhandene funktionale und leistungsbezogene Herausforderungen mithilfe eines neuen zugrunde liegenden Verbindungsprotokolls namens QUIC. QUIC stellt Verbindungen schneller her, und Verbindungen sind unabhängig von der IP-Adresse, sodass mobile Clients zwischen WLAN und Mobilfunknetzen roamingn können. Weitere Informationen finden Sie unter Verwendung 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 nun aus JavaScript gerendert und in vorhandene JavaScript-basierte Apps integriert werden. Weitere Informationen finden Sie unter Neues in ASP.NET Core 6.

OpenTelemetry

.NET 6 bietet verbesserte Unterstützung für OpenTelemetry-, die eine Sammlung von Tools, APIs und SDKs ist, die Ihnen helfen, die Leistung und das Verhalten Ihrer Software zu analysieren. APIs im Namespace System.Diagnostics.Metrics implementieren die OpenTelemetry Metrics-API-Spezifikation. Beispielsweise gibt es vier Instrumentklassen, um verschiedene Metrikszenarien zu unterstützen. Die Instrumentenklassen 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 bietet Unterstützung für CET für Windows x64-Apps, und Sie müssen es explizit aktivieren. 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, ist jedoch nur standardmäßig auf Apple Silicon aktiviert. W^X blockiert den einfachsten Angriffspfad, indem verhindert wird, dass Speicherseiten gleichzeitig schreibbar 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. .NET 6 ermöglicht auch das Entfernen von nicht verwendeten Typen und Membern. 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.

Individuell angepasste Plattformschutzvorrichtungen

Das Analysetool für Plattformkompatibilität erkennt die Is<Platform>-Methoden in der Klasse OperatingSystem, zum Beispiel OperatingSystem.IsWindows(), als Plattformwächter. Um benutzerdefinierte Plattformschutze zu ermöglichen, führt .NET 6 zwei neue Attribute ein, mit denen Sie Felder, Eigenschaften oder Methoden mit einem unterstützten oder nicht unterstützten Plattformnamen annotieren können.

Windows Forms

Application.SetDefaultFont(Font) ist eine neue Methode in .NET 6, die die Standardschriftart in Ihrer Anwendung festlegt.

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 Bootstrap-Code ist ein Aufruf von ApplicationConfiguration.Initialize(), einer quellgenerierten 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 Neuigkeiten 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, z. B. Red Hat, können ihre eigene Version des SDK mit diesem Quell-Tarball 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. IAdditionOperators den + Operator darstellt. Die Schnittstellen sind im System.Runtime.Experimental NuGet-Paket verfügbar. Weitere Informationen finden Sie im Blogbeitrag Generische Mathematik.

NuGet-Paketvalidierung

Wenn Sie ein NuGet-Bibliotheksentwickler sind, können Sie mit neuen Paketüberprüfungstools überprüfen, ob Ihre Pakete konsistent und wohlgeformt sind. Sie können feststellen, ob:

  • Ob es Breaking Changes zwischen Paketversionen gibt
  • Das Paket verfügt über den gleichen Satz öffentlicher APIs für alle laufzeitspezifischen Implementierungen.
  • Ob es Lücken bei der Anwendbarkeit des Zielframeworks oder der Runtime gibt

Weitere Informationen finden Sie im Blogbeitrag Paketvalidierung.

Reflexions-APIs

.NET 6 führt die folgenden neuen APIs ein, die Code prüfen und Nullbarkeitsinformationen bereitstellen:

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

Microsoft.Extensions-APIs

Mehrere Erweiterungsnamespaces weisen Verbesserungen in .NET 6 auf, wie in der folgenden Tabelle dargestellt.

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 Neue ConfigureHostOptions Methoden vereinfachen das Einrichten von Anwendungen.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging verfügt über einen neuen Quellgenerator für performante 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

Zahlreiche LINQ-Methoden wurden in .NET 6 hinzugefügt. Die meisten neuen Methoden, die in der folgenden Tabelle aufgeführt sind, weisen im System.Linq.Queryable Typ gleichwertige Methoden auf.

Methode Beschreibung
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Versucht, die Anzahl der Elemente in einer Sequenz zu ermitteln, ohne eine Enumeration zu erzwingen.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Teilt die Elemente einer Sequenz in Blöcke einer angegebenen 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 bei Datum, Uhrzeit und Zeitzone

Die folgenden beiden Strukturen wurden in .NET 6 hinzugefügt: System.DateOnly und System.TimeOnly. Diese stellen den Datums- bzw. den Uhrzeitteil einer DateTime-Struktur dar. DateOnly ist nützlich für Geburtstage und Jahrestage, und TimeOnly ist nützlich für tägliche Alarme und wöchentliche Geschäftszeiten.

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

Es gibt auch einige weitere Verbesserungen in der Zeitzone. Weitere Informationen finden Sie unter Verbesserungen an Datum, Uhrzeit und Zeitzone in .NET 6.

PriorityQueue-Klasse

Die neue PriorityQueue<TElement,TPriority> Klasse stellt eine Auflistung von Elementen dar, die sowohl einen Wert als auch eine Priorität aufweisen. Die Elemente werden in aufsteigender Prioritätsreihenfolge 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