Neuerungen in C# 11

Ab dem .NET 6.0.200 SDK oder Visual Studio 2022, Version 17.1, können Sie Vorschaufeatures in C# ausprobieren.

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 Version 6.0.200 des .NET SDK verfügbar. Sie sind in Visual Studio 2022, Version 17.2, verfügbar.

Sie können die neueste Version von .NET SDK 6 über die .NET-Downloadseite herunterladen. Sie können auch die Version Visual Studio 2022 herunterladen, die das .NET SDK 6 enthält. 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. Dies bietet eine praktischere Syntax für Attribute, die einen Parameter System.Type 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
  • nint, nuint
  • 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.
  • Anstelle von nint oder unint verwenden Sie IntPtr.
  • string anstelle von string?.
  • ValueTuple<int, int> anstelle von (int X, int Y).

Statische abstrakte Member in Schnittstellen

Wichtig

Statische abstrakte Member in Schnittstellen sind ein Laufzeitvorschaufeature. Sie müssen Ihrer Projektdatei <EnablePreviewFeatures>True</EnablePreviewFeatures> hinzufügen. Weitere Informationen zu Laufzeitvorschaufeatures finden Sie unter Vorschaufeatures. Sie können mit diesem Feature und den experimentellen Bibliotheken experimentieren, die es verwenden. Wir nutzen das Feedback aus den Vorschauzyklen, um das Feature vor der allgemeinen Veröffentlichung zu verbessern.

Sie können statische abstrakte Member in Schnittstellen hinzufügen, um Schnittstellen zu definieren, die überladbare Operatoren, andere statische Member und statische Eigenschaften enthalten. Das primäre Szenario für dieses Feature ist die Verwendung mathematischer Operatoren in generischen Typen. Das Team der .NET-Runtime hat Schnittstellen für mathematische Operationen in das NuGet-Paket System.Runtime.Experimental integriert. Beispielsweise können Sie System.IAdditionOperators<TSelf, TOther, TResult> in einem Typ implementieren, der operator + implementiert. Andere Schnittstellen definieren andere mathematische Operationen oder genau definierte Werte.

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.

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 Zeilenvorschübe nach dem öffnenden und vor dem schließenden Anführungszeichen gehören nicht zum endgültigen Inhalt:

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 obigen Beispiel ist angegeben, dass zwei Klammern eine Interpolation starten und 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.