Was ist neu in C# 10?

0
149
Maria Vonotna/Shutterstock.com< /figure>

C# 10 wurde im November 2021 zusammen mit Visual Studio 2022 und .NET 6 veröffentlicht. Es fügt mehrere neue Funktionen hinzu, die die Arbeit einfacher und bequemer machen. Hier eine Tour durch einige der nützlichsten Ergänzungen und wie sie Ihren Arbeitsablauf verbessern.

Dateibezogene Namespaces

Beginnen wir mit einer der einfachsten, aber vielleicht bedeutendsten Änderungen. Sie können jetzt über eine neue Syntaxoption für das Schlüsselwort namespace einen Namespace auf eine gesamte Datei anwenden. Der verbleibende Code in der Datei wird automatisch mit einem Namespace versehen, auch wenn er nicht innerhalb eines Namespace-Blocks eingerückt ist. Dies funktioniert ähnlich wie Namespace-Deklarationen in PHP.

In C# 9 brauchten Sie diesen Code, um einer Klasse einen Namensraum zu geben:

Namespace-Demo {   öffentliche Klasse Beispiel { }   }

In C# 10 können Sie stattdessen Folgendes verwenden:

namespace Demo;   öffentliche Klasse Beispiel { }

Dadurch sparen Sie horizontalen Platz in Ihrem Editor, indem Sie eine Einrückungsebene ausschneiden. Wenn die Datei mehrere Klassen enthalten muss, können Sie sie alle beginnend bei Spalte Null schreiben – die Namespace-Deklaration gilt für die gesamte Datei.

Global Usings

Einige Namespaces werden projektübergreifend sehr häufig verwendet. Sie müssen sie jedoch immer noch manuell in jede Datei mit einer using-Anweisung einfügen.

Ankündigung

C# 10 ändert dies, um eine globale using-Variante zu unterstützen. Dadurch wird der referenzierte Namespace für alle Dateien in Ihrem Projekt zugänglich.

global using System;

Globale Verwendungen können zu jeder Datei hinzugefügt werden, die in Ihre Zusammenstellung aufgenommen wird. Sie unterstützen alle Funktionen von standardmäßigen using-Anweisungen, einschließlich des Schlüsselworts static und Aliasing mit =.

Durch die Übernahme globaler Verwendungen wird die Anzahl der Zeilen verringert, die Sie schreiben, aber sie sind immer noch am besten für häufig referenzierte Namespaces reserviert, bei denen die Wahrscheinlichkeit von Namenskollisionen gering ist. Beachten Sie, dass das Verlassen auf eine globale Verwendung Ihren Code undurchsichtiger machen könnte, da neue Mitwirkende möglicherweise nicht sofort erkennen, wie eine Namespace-Ressource eingeschlossen wurde.

Eine Begleitfunktion zu globalen Verwendungen sind implizite Verwendungen. Dadurch werden automatisch globale using-Anweisungen erstellt, die für den Typ Ihres Projekts geeignet sind. Die Funktion ist in den .NET 6-Projektvorlagen standardmäßig aktiviert. Sie kann mit der Einstellung ImplicitUsings in Ihrer .csproj-Datei deaktiviert werden.

Verbesserte Strukturen

Strukturen haben mehrere Verbesserungen erhalten, die sie den Klassen näher bringen. Dazu gehören parameterlose Konstruktoren, Feldinitialisierer, volle Unterstützung für with-Ausdrücke und die Möglichkeit, Datensatzstrukturen zu erstellen:

öffentlicher Datensatz Point(int X, int Y);

In diesem Beispiel wird ein “positional” record struct, bei dem die X- und Y-Konstruktorparameter zu impliziten öffentlichen Membern werden. Sie können Mitglieder auch manuell mit der vorhandenen Syntax definieren:

Struktur des öffentlichen Datensatzes Punkt { public int X { werden; drin; } public int Y { werden; drin; } } Ankündigung

Eine Datensatzstruktur sollte in Szenarien verwendet werden, in denen Sie einige Daten kapseln müssen, ohne benutzerdefiniertes Verhalten als Klassenmethoden anzufügen. Eine Datensatzstruktur bietet integrierte Wertgleichheitsprüfungen und Funktionen wie ToString(). Sie kann über das Schlüsselwort readonly entweder veränderbar oder unveränderlich sein.

Lambda-Ausdruckserweiterungen

C# 10 fügt mehrere Verbesserungen an Lambda-Ausdrücken hinzu, die ihre Typen und Syntax abdecken. Ziel ist es, Lambdas regulären Methoden und lokalen Funktionen ähnlicher zu machen. Die Definition eines solchen wird Ihnen jetzt vertrauter.

Das Konzept eines “natürlichen” Typ eingeführt wurde. Dadurch kann der Compiler einen Lambda-Typ ableiten, ohne ihn manuell in einen Delegaten oder Ausdruck zu konvertieren. Dies erzeugt lesbareren Code, wenn einer Variablen ein Lambda zugewiesen wird:

//C# 9 Func<string, int> toInt = (Zeichenfolge s) => int.Parse(s);   //C# 10 var toInt = (string s) => int.Parse(s)

Der Compiler leitet den Typ von toInt als Func<string, int> und dies wird angezeigt, wenn Sie den Code in Visual Studio anzeigen. Inferenzen verwenden Func, Action oder synthetisierte Delegaten.

Natürliche Typen funktionieren nur, wenn Ihr Lambda-Ausdruck bereits vollständig typisiert ist. Wenn Sie Parametertypen weglassen, kann der Compiler keine kompatible Typdefinition erstellen.

Eine damit verbundene Änderung ist die Unterstützung expliziter Rückgabetypen. Wie bei einer regulären Funktion steht der Rückgabetyp vor der Parameterliste des Lambda:

var toInt = int (string s) => int.Parse(s)

Schließlich können Lambdas nun Attribute genauso wie Methoden und Funktionen annehmen. Sie werden am Anfang des Lambda-Ausdrucks vor dem Rückgabetyp und der Parameterliste positioniert. Sie können Attribute verwenden, um Ihren Lambdas zusätzliche Metadaten hinzuzufügen, um eine bessere Selbstbeobachtung und Codeanalyse zu ermöglichen.

var toInt = [DemoAttribute()] int (string s) => int.Parse(s)

Vielseitige dekonstruierte Zuweisungen

Dekonstruktionszuweisungen können jetzt sowohl neue Variablen initialisieren als auch bestehenden Variablen in derselben Zeile Werte zuweisen. Bisher mussten Sie für diese Operationen separate Dekonstruktionen verwenden.

Werbung

In C# 9 führte dies zu Code, der wie folgt aussah:

int x = 0; int y = 0; (x, y) = Punkt;   (int z) = Punkt;

Während Sie in C# 10 dies tun können:

int x = 0; int y = 0; (x, y, int z) = Punkt;

Jetzt werden x, y und z alle mit Werten unter Verwendung der einzelnen Dekonstruktionszuweisung initialisiert, wodurch Wiederholungen in Ihrem Code reduziert werden.

Andere Änderungen

Die String-Interpolation wurde verbessert und funktioniert jetzt auch mit konstanten Strings. Sie müssen sicherstellen, dass alle Zeichenfolgen, die zum Füllen der Platzhalterlöcher während der Interpolation verwendet werden, selbst konstante Werte sind. Allgemeiner gesagt können Optimierungen des Interpolationsprozesses den Speicherverbrauch reduzieren und die Leistung durch die Verwendung von dedizierten Handlern erhöhen.

Eigenschaftsmuster wurden vereinfacht, um einen lesbareren Zugriff auf verschachtelte Eigenschaften zu ermöglichen. Sie können jetzt die Punktsyntax verwenden, um auf verschachtelte Eigenschaftswerte zuzugreifen, anstatt auf mehrere Ebenen von Klammern:

//C# 9 { Zug: {Ankunftszeit: "10:00"} }   //C# 10 { Zug.Ankunftszeit: "10:00" }

An anderer Stelle bedeuten Compiler-Optimierungen, dass Sie bei definitiven Zuweisungen und Nullzustandsprüfungen von weniger Fehlalarmen profitieren. Mehrere C# 9-Probleme, die zur Kompilierzeit falsche Warnungen auslösten, wurden behoben, was zu genaueren Prüfungen führte, die Ihnen beim Debuggen von Problemen helfen, die wirklich wichtig sind. Die Probleme waren mit der Verwendung von Null-Koaleszenz-Ausdrücken und Variablenvergleichen mit booleschen Konstanten verbunden.

Schlussfolgerung

C# 10 fügt mehrere neue Funktionen hinzu, die die Entwicklung einfacher machen . Viele andere neue Funktionen, einschließlich des Feldschlüsselworts und der erforderlichen Eigenschaften, wurden jedoch auf die nächste Hauptversion verschoben. Generische Attribute und statische abstrakte Member für Schnittstellen haben es in 10 geschafft, aber das Vorschau-Tag ist immer noch angehängt.

Werbung

Sie können C# 10 noch heute verwenden, indem Sie Visual Studio 2022 herunterladen. Die Sprache ist auch als . verfügbar Teil des eigenständigen .NET 6 SDK, das unter Windows, Mac und Linux funktioniert.