Neuerungen in C# 11

Wichtig

Dies sind derzeit Vorschaufeatures. Sie müssen <LangVersion> auf preview festlegen, um diese Features zu aktivieren. Alle Features können sich vor ihrer endgültigen Veröffentlichung noch ändern. Diese Features werden möglicherweise nicht alle in C# 11 veröffentlicht. Je nach Feedback können einige Features länger in der Vorschauphase verbleiben.

Die folgenden Features sind in Visual Studio 2022 Version 17.3 verfügbar:

Die folgenden Features sind in Visual Studio 2022, Version 17.2, verfügbar:

Die folgenden Features sind in Visual Studio 2022, Version 17.1, verfügbar:

Sie können das neueste Visual Studio 2022 herunterladen. Sie können all diese Features auch mit der Vorschauversion des .NET 7 SDK ausprobieren, die auf der Seite Alle .NET-Downloads heruntergeladen werden kann.

Generische Attribute

Sie können eine generische Klasse deklarieren, deren Basisklasse System.Attribute ist. Dieses Feature bietet eine komfortablere Syntax für Attribute, die einen System.Type Parameter erfordern. Zuvor müssten Sie ein Attribut erstellen, das als Konstruktorparameter Type akzeptiert:

// Before C# 11:
public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

Um das Attribut anzuwenden, verwenden Sie den Operator typeof:

[TypeAttribute(typeof(string))]
public string Method() => default;

Mit dieser neuen Funktion können Sie stattdessen ein generisches Attribut erstellen:

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

Geben Sie dann den Typparameter an, um das Attribut zu verwenden:

[GenericAttribute<string>()]
public string Method() => default;

Wenn Sie das Attribut anwenden, müssen Sie alle Typparameter angeben. Anders gesagt: Der generische Typ muss vollständig konstruiert werden.

public class GenericType<T>
{
   [GenericAttribute<T>()] // Not allowed! generic attributes must be fully constructed types.
   public string Method() => default;
}

Die Typargumente müssen die gleichen Einschränkungen wie der Operator typeof erfüllen. Typen, die Metadatenanmerkungen erfordern, sind nicht zulässig. Die folgenden Typen beispielsweise sind als Typparameter nicht zulässig:

  • dynamic
  • string? (oder nullwertfähige Verweistypen)
  • (int X, int Y) (oder andere Tupeltypen mit C#-Tupelsyntax).

Diese Typen werden nicht direkt in Metadaten dargestellt. Sie enthalten Anmerkungen, die den Typ beschreiben. In allen Fällen können Sie stattdessen den zugrunde liegenden Typ verwenden:

  • object für dynamic.
  • string anstelle von string?.
  • ValueTuple<int, int> anstelle von (int X, int Y).

Generische mathematische Unterstützung

Es gibt mehrere Sprachfeatures, die generische mathematische Unterstützung aktivieren:

  • static virtual Member in Schnittstellen
  • überprüfte benutzerdefinierte Operatoren
  • entspannte Schichtoperatoren
  • Nicht signierter Operator für die rechte Schicht

Sie können Schnittstellen hinzufügen oder Member hinzufügen static abstract , static virtual um Schnittstellen zu definieren, die überladene Operatoren, andere statische Elemente und statische Eigenschaften enthalten. Das primäre Szenario für dieses Feature ist die Verwendung mathematischer Operatoren in generischen Typen. Sie können beispielsweise die Schnittstelle in einem Typ implementieren, der System.IAdditionOperators<TSelf, TOther, TResult> implementiert operator +wird. Andere Schnittstellen definieren andere mathematische Operationen oder genau definierte Werte. Sie erfahren mehr über die neue Syntax im Artikel zu Schnittstellen. Schnittstellen, die Methoden enthalten static virtual , sind in der Regel generische Schnittstellen. Darüber hinaus deklarieren die meisten eine Einschränkung, die der Typparameter die deklarierte Schnittstelle implementiert.

Im Tutorial Erkunden statischer abstrakter Schnittstellenmember () oder dem Blogbeitrag Preview features in .NET 6 – generic math erfahren Sie mehr über das Feature und können es ausprobieren.

Generische Mathematik hat andere Anforderungen für die Sprache erstellt.

  • Nicht signierter Operator für die rechte Schicht: Bevor C# 11 erzwungen wird, müssen Sie einen nicht signierten ganzzahligen Typ in einen nicht signierten Typ umwandeln, die Schicht ausführen und das Ergebnis dann wieder in einen signierten Typ umwandeln. Ab C# 11 können Sie den >>>nicht signierten Schichtoperator verwenden.
  • Entspannte Schichtoperatoranforderungen: C# 11 entfernt die Anforderung, dass der zweite Operand ein int oder implizit zu konvertierbar intsein muss. Diese Änderung ermöglicht Typen, die generische mathematische Schnittstellen implementieren, die an diesen Speicherorten verwendet werden.
  • aktivierte und deaktivierte benutzerdefinierte Operatoren: Entwickler können jetzt operatoren definieren und unchecked arithmetische Operatoren definierenchecked. Der Compiler generiert Aufrufe der richtigen Variante basierend auf dem aktuellen Kontext. Weitere Informationen zu checked Operatoren finden Sie im Artikel zu Arithmetischen Operatoren.

Numerische IntPtr und UIntPtr

Die nint und nuint typen jetzt Alias System.IntPtr und System.UIntPtr, bzw.

Zeilenvorschübe in Zeichenfolgeninterpolationen

Der Text innerhalb der Zeichen { und } für eine Zeichenfolgeninterpolation darf jetzt mehrere Zeilen umfassen. Der Text zwischen den Markern { und } wird als C# geparst. Alle älteren C#-Befehle, einschließlich Zeilenvorschub, sind weiterhin zulässig. Dieses Feature erleichtert das Lesen von Zeichenfolgeninterpolationen, die längere C#-Ausdrücke verwenden, z. B. switch-Ausdrücke zum Musterabgleich oder LINQ-Abfragen.

Im Artikel Zeichenfolgeninterpolationen in der Sprachreferenz erfahren Sie mehr über das neue Zeilenvorschubfeature.

Listenmuster

Listenmuster erweitern den Musterabgleich und ermöglichen den Abgleich von Elementsequenzen in einer Liste oder einem Array. Ein Beispiel: sequence is [1, 2, 3] ist true, wenn sequence ein Array oder eine Liste mit drei Integerwerten (1, 2 und 3) ist. Sie können Elemente mit beliebigen Mustern abgleichen, einschließlich Konstanten, Typen, Eigenschaften und relationalen Mustern. Das Ausschussmuster (_) stimmt mit einem beliebigen einzelnen Element überein, und das neue Bereichsmuster (..) stimmt mit jeder Sequenz aus null oder mehr Elementen überein.

Weitere Informationen zu Listenmustern finden Sie im Artikel zum Musterabgleich in der Sprachreferenz.

Verbesserte Methodengruppenkonvertierung zu Delegaten

Der C#-Standard für Methodengruppenkonvertierungen enthält jetzt das folgende Element:

  • Die Konvertierung ist zulässig (aber nicht erforderlich), um eine vorhandene Delegatinstanz zu verwenden, die bereits diese Verweise enthält.

Frühere Versionen des Standards verhinderten, dass der Compiler das für eine Methodengruppenkonvertierung erstellte Delegatobjekt erneut verwendete. Der C# 11-Compiler speichert das aus einer Methodengruppenkonvertierung erstellte Delegatobjekt zwischen und verwendet dieses einzelne Delegatobjekt. Dieses Feature ist erstmals in Visual Studio 17.2 als Vorschaufeature verfügbar. Es ist erstmals in .NET 7 Preview 2 verfügbar.

Unformatierte Zeichenfolgenliterale

Unformatierte Zeichenfolgenliterale sind ein neues Format für Zeichenfolgenliterale. Unformatierte Zeichenfolgenliterale können beliebigen Text enthalten, einschließlich Leerzeichen, Zeilenvorschubzeichen, eingebetteten Anführungszeichen und anderen Sonderzeichen, ohne dass Escapesequenzen erforderlich sind. Ein unformatiertes Zeichenfolgenliteral beginnt mit mindestens drei doppelten geraden Anführungszeichen oben ("""). Es endet mit der gleichen Anzahl von doppelten Anführungszeichen. In der Regel verwendet ein unformatiertes Zeichenfolgenliteral drei doppelte Anführungszeichen in einer einzelnen Zeile, um die Zeichenfolge zu starten, und drei doppelte Anführungszeichen in einer separaten Zeile, um die Zeichenfolge zu beenden. Die neuen Linien nach dem Eröffnungsangebot und vor dem schließenden Anführungszeichen sind nicht im endgültigen Inhalt enthalten:

string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

Alle Leerzeichen links von den schließenden doppelten Anführungszeichen werden aus dem Zeichenfolgenliteral entfernt. Unformatierte Zeichenfolgenliterale können mit Zeichenfolgeninterpolation kombiniert werden, um Klammern in den Ausgabetext einzuschließen. Mehrere $-Zeichen geben an, wie viele aufeinander folgende Klammern die Interpolation starten und beenden:

var location = $$"""
   You are at {{{Longitude}}, {{Latitude}}}
   """;

Im vorherigen Beispiel wird angegeben, dass zwei geschweifte Klammern beginnen und eine Interpolation beenden. Das dritte Paar aus öffnender und schließender Klammer ist in der Ausgabezeichenfolge enthalten.

Mehr über unformatierte Zeichenfolgenliterale erfahren Sie im Artikel zu Zeichenfolgen im Programmierleitfaden und in den Artikeln zu Zeichenfolgenliteralen und interpolierten Zeichenfolgen in der Sprachreferenz.

Automatische Standardstruktur

Der C# 11-Compiler stellt sicher, dass alle Felder eines struct Typs als Teil der Ausführung eines Konstruktors initialisiert werden. Diese Änderung bedeutet, dass jedes Feld oder eine automatische Eigenschaft, die von einem Konstruktor nicht initialisiert wird, automatisch vom Compiler initialisiert wird. Structs, bei denen der Konstruktor nicht definitiv alle Felder zuweisen, die jetzt kompiliert werden, und alle Felder, die nicht explizit initialisiert werden, werden auf ihren Standardwert festgelegt. Sie können mehr darüber erfahren, wie sich diese Änderung auf die Initialisierung der Struktur im Artikel über structs auswirkt.

Muster-Übereinstimmung Span<char> oder ReadOnlySpan<char> auf einer Konstanten string

Sie haben die Möglichkeit, zu testen, ob ein string bestimmter Konstantenwert mit Musterabgleich für mehrere Versionen verwendet wurde. Jetzt können Sie dieselbe Musterabgleichslogik mit Variablen verwenden, die sind Span<char> oder ReadOnlySpan<char>.

Erweiterter Name des Bereichs

Typparameternamen und Parameternamen befinden sich jetzt im Bereich, wenn in einem Ausdruck in einer nameofAttributdeklaration dieser Methode verwendet wird. Dieses Feature bedeutet, dass Sie den Operator verwenden können, um den nameof Namen eines Methodenparameters in einem Attribut für die Methode oder die Parameterdeklaration anzugeben. Dieses Feature ist am häufigsten nützlich, um Attribute für nullable Analyse hinzuzufügen.

Erforderliche Member

Sie können den Eigenschaften und Feldern den required Modifizierer hinzufügen, um Konstruktoren und Aufrufer zu erzwingen, um diese Werte zu initialisieren. Dies System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute kann zu Konstruktoren hinzugefügt werden, um den Compiler zu informieren, dass ein Konstruktor alle erforderlichen Elemente initialisiert.

Weitere Informationen finden Sie init-only .