Nieuw in C# 11

De volgende functies zijn toegevoegd in C# 11:

C# 11 wordt ondersteund op .NET 7. Zie C#-taalversiebeheer voor meer informatie.

U kunt de nieuwste .NET 7 SDK downloaden vanaf de .NET-downloadpagina. U kunt ook Visual Studio 2022 downloaden, waaronder de .NET 7 SDK.

Notitie

We zijn geïnteresseerd in uw feedback over deze functies. Als u problemen ondervindt met een van deze nieuwe functies, maakt u een nieuw probleem in de dotnet-/roslyn-opslagplaats .

Algemene kenmerken

U kunt een algemene klasse declareren waarvan de basisklasse is System.Attribute. Deze functie biedt een handigere syntaxis voor kenmerken waarvoor een System.Type parameter is vereist. Voorheen moet u een kenmerk maken dat een Type als constructorparameter gebruikt:

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

   public Type ParamType { get; }
}

En als u het kenmerk wilt toepassen, gebruikt u de typeof operator:

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

Met deze nieuwe functie kunt u in plaats daarvan een algemeen kenmerk maken:

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

Geef vervolgens de typeparameter op om het kenmerk te gebruiken:

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

U moet alle typeparameters opgeven wanneer u het kenmerk toepast. Met andere woorden, het algemene type moet volledig worden samengesteld. In het bovenstaande voorbeeld kunnen de lege haakjes (( en )) worden weggelaten omdat het kenmerk geen argumenten heeft.

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

De typeargumenten moeten voldoen aan dezelfde beperkingen als de typeof operator. Typen waarvoor metagegevensaantekeningen zijn vereist, zijn niet toegestaan. De volgende typen zijn bijvoorbeeld niet toegestaan als de typeparameter:

  • dynamic
  • string? (of een null-verwijzingstype)
  • (int X, int Y) (of andere tupletypen met C#-tuplesyntaxis).

Deze typen worden niet rechtstreeks weergegeven in metagegevens. Ze bevatten aantekeningen die het type beschrijven. In alle gevallen kunt u in plaats daarvan het onderliggende type gebruiken:

  • object voor dynamic.
  • string in plaats van string?.
  • ValueTuple<int, int> in plaats van (int X, int Y).

Algemene ondersteuning voor wiskunde

Er zijn verschillende taalfuncties waarmee algemene wiskundige ondersteuning mogelijk is:

  • static virtual leden in interfaces
  • door de gebruiker gedefinieerde operators gecontroleerd
  • ontspannen shiftoperators
  • niet-ondertekende operator voor right-shift

U kunt of static virtual leden toevoegen static abstract aan interfaces om interfaces te definiëren die overbelaste operators, andere statische leden en statische eigenschappen bevatten. Het primaire scenario voor deze functie is het gebruik van wiskundige operatoren in algemene typen. U kunt bijvoorbeeld de System.IAdditionOperators<TSelf, TOther, TResult> interface implementeren in een type dat wordt geïmplementeerd operator +. Andere interfaces definiëren andere wiskundige bewerkingen of goed gedefinieerde waarden. In het artikel over interfaces vindt u meer informatie over de nieuwe syntaxis. Interfaces met static virtual methoden zijn doorgaans algemene interfaces. Bovendien declareert de meeste een beperking waarmee de typeparameter de gedeclareerde interface implementeert.

U kunt meer informatie krijgen en de functie zelf uitproberen in de zelfstudie Leden van de statische abstracte interface verkennen of de preview-functies in .NET 6 - algemene wiskundige blogpost.

Algemene wiskundige berekeningen hebben andere vereisten voor de taal gemaakt.

  • operator voor niet-ondertekende rechterdienst: voor C# 11 moet u een ondertekend geheel getal naar een niet-ondertekend type casten, de dienst uitvoeren en het resultaat vervolgens terugzetten naar een ondertekend type. Vanaf C# 11 kunt u de >>>operator voor de niet-ondertekende dienst gebruiken.
  • relaxte ploegenoperatorvereisten: C# 11 verwijdert de vereiste dat de tweede operand een int of impliciet converteerbaar moet zijn naar int. Met deze wijziging kunnen typen die algemene wiskundige interfaces implementeren, op deze locaties worden gebruikt.
  • door de gebruiker gedefinieerde operators zijn ingeschakeld en uitgeschakeld: ontwikkelaars kunnen nu rekenkundige operatoren definiëren checked en unchecked controleren. De compiler genereert aanroepen naar de juiste variant op basis van de huidige context. Meer informatie over operators vindt u in het artikel over checkedrekenkundige operatoren.

Numeriek en IntPtrUIntPtr

De nint en nuint typen nu alias System.IntPtr en System.UIntPtrrespectievelijk.

Nieuwe regels in tekenreeksinterpolaties

De tekst in de { en } tekens voor een tekenreeksinterpolatie kan nu meerdere regels omvatten. De tekst tussen de { markeringen wordt } geparseerd als C#. Alle juridische C#, inclusief nieuwe regels, is toegestaan. Deze functie maakt het gemakkelijker om tekenreeksinterpolaties te lezen die langere C#-expressies gebruiken, zoals patroonkoppelingsexpressies switch of LINQ-query's.

Meer informatie over de functie nieuwe regels vindt u in het artikel tekenreeksinterpolaties in de taalreferentie.

Lijstpatronen

Lijstpatronen breiden patroonkoppelingen uit om overeenkomende reeksen elementen in een lijst of een matrix te vinden. Bijvoorbeeld sequence is [1, 2, 3]true wanneer het sequence een matrix is of een lijst met drie gehele getallen (1, 2 en 3). U kunt elementen vergelijken met elk patroon, waaronder constant, type, eigenschap en relationele patronen. Het verwijderingspatroon (_) komt overeen met een willekeurig element en het nieuwe bereikpatroon (..) komt overeen met een reeks nul of meer elementen.

Meer informatie over lijstpatronen vindt u in het artikel over patroonkoppeling in de taalreferentie.

Verbeterde conversie van methodegroep naar gemachtigde

De C#-standaard voor methodegroepconversies bevat nu het volgende item:

  • De conversie is toegestaan (maar niet vereist) om een bestaand gemachtigde exemplaar te gebruiken dat deze verwijzingen al bevat.

In eerdere versies van de standaard is het niet toegestaan dat de compiler het gedelegeerde object dat is gemaakt voor een methodegroepconversie hergebruikt. De C# 11-compiler slaat het gemachtigde object in de cache op dat is gemaakt op basis van een methodegroepconversie en hergebruikt dat ene gedelegeerde object. Deze functie was voor het eerst beschikbaar in Visual Studio 2022 versie 17.2 als preview-functie en in .NET 7 Preview 2.

Letterlijke tekenreeksen van onbewerkte tekenreeks

Letterlijke tekenreeksen voor onbewerkte tekenreeksen zijn een nieuwe indeling voor letterlijke tekenreeksen. Letterlijke tekenreeksen van onbewerkte tekenreeksen kunnen willekeurige tekst bevatten, waaronder witruimte, nieuwe regels, ingesloten aanhalingstekens en andere speciale tekens zonder escapereeksen. Een letterlijke tekenreeks begint met ten minste drie dubbele aanhalingstekens (""). Het eindigt met hetzelfde aantal dubbele aanhalingstekens. Normaal gesproken gebruikt een letterlijke tekenreeks drie dubbele aanhalingstekens op één regel om de tekenreeks te starten en drie dubbele aanhalingstekens op een afzonderlijke regel om de tekenreeks te beëindigen. De nieuwe regels na de openingscitaat en voorafgaand aan de slotcitaat worden niet opgenomen in de uiteindelijke inhoud:

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.
    """;

Eventuele spaties links van de dubbele aanhalingstekens sluiten worden verwijderd uit de letterlijke tekenreeks. Letterlijke tekenreeksen van onbewerkte tekenreeksen kunnen worden gecombineerd met tekenreeksinterpolatie om accolades in de uitvoertekst op te nemen. Meerdere $ tekens geven aan hoeveel opeenvolgende accolades de interpolatie starten en beëindigen:

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

In het voorgaande voorbeeld wordt aangegeven dat twee accolades een interpolatie starten en beëindigen. De derde herhaalde accolade voor openen en sluiten wordt opgenomen in de uitvoertekenreeks.

In het artikel over tekenreeksen vindt u meer informatie over letterlijke tekenreeksen in de programmeerhandleiding en de naslagartikelen over letterlijke tekenreeksen en geïnterpoleerde tekenreeksen.

Automatisch standaard struct

De C# 11-compiler zorgt ervoor dat alle velden van een struct type worden geïnitialiseerd naar hun standaardwaarde als onderdeel van het uitvoeren van een constructor. Deze wijziging betekent dat een veld of automatische eigenschap die niet door een constructor wordt geïnitialiseerd, automatisch wordt geïnitialiseerd door de compiler. Structs waarbij de constructor niet zeker alle velden nu compileert en eventuele velden die niet expliciet zijn geïnitialiseerd, worden ingesteld op de standaardwaarde. Meer informatie over hoe deze wijziging van invloed is op de initialisatie van de struct in het artikel over structs.

Patroonovereenkomst Span<char> of ReadOnlySpan<char> op een constante string

U hebt kunnen testen of een string specifieke constante waarde met behulp van patroonkoppelingen voor verschillende releases had. U kunt nu dezelfde patroonkoppelingslogica gebruiken met variabelen die of Span<char>ReadOnlySpan<char>.

Uitgebreid naambereik

Typ parameternamen en parameternamen zijn nu binnen het bereik wanneer deze worden gebruikt in een nameof expressie in een kenmerkdeclaratie voor die methode. Deze functie betekent dat u de nameof operator kunt gebruiken om de naam van een methodeparameter op te geven in een kenmerk voor de methode- of parameterdeclaratie. Deze functie is het meest handig om kenmerken toe te voegen voor een null-analyse.

Letterlijke tekenreeksen van UTF-8

U kunt het u8 achtervoegsel voor een letterlijke tekenreeks opgeven om UTF-8-tekencodering op te geven. Als uw toepassing UTF-8-tekenreeksen nodig heeft, voor HTTP-tekenreeksconstanten of vergelijkbare tekstprotocollen, kunt u deze functie gebruiken om het maken van UTF-8-tekenreeksen te vereenvoudigen.

Meer informatie over letterlijke tekenreeksen van UTF-8 vindt u in de letterlijke tekenreekssectie van het artikel over ingebouwde referentietypen.

Vereiste leden

U kunt de required wijzigingsfunctie toevoegen aan eigenschappen en velden om constructors en aanroepers af te dwingen om deze waarden te initialiseren. De System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute kan worden toegevoegd aan constructors om de compiler te informeren dat een constructor alle vereiste leden initialiseert.

Zie de sectie alleen-init van het eigenschappenartikel voor meer informatie over vereiste leden.

ref velden en ref scoped variabelen

U kunt ref velden binnen een ref struct. Dit ondersteunt typen, zoals System.Span<T> zonder speciale kenmerken of verborgen interne typen.

U kunt de scoped wijzigingsfunctie toevoegen aan elke ref declaratie. Hierdoor wordt het bereik beperkt waarnaar de verwijzing kan ontsnappen.

Lokale bestandstypen

Vanaf C# 11 kunt u de file toegangsaanpassing gebruiken om een type te maken waarvan de zichtbaarheid is afgestemd op het bronbestand waarin het is gedeclareerd. Deze functie helpt auteurs van brongeneratoren om naamconflicten te voorkomen. Meer informatie over deze functie vindt u in het artikel over bestandstypen in de taalverwijzing.

Zie ook