Nieuw in C# 11
De volgende functies zijn toegevoegd in C# 11:
- Letterlijke tekenreeksen van onbewerkte tekenreeks
- Algemene ondersteuning voor wiskunde
- Algemene kenmerken
- Letterlijke tekenreeksen van UTF-8
- Nieuwe regels in tekenreeksinterpolatie-expressies
- Lijstpatronen
- Bestandstypen
- Vereiste leden
- Automatisch standaard structs
- Patroonovereenkomst
Span<char>
op een constantestring
- Uitgebreid
nameof
bereik - Numerieke intptr
ref
velden enscoped ref
- Verbeterde conversie van methodegroep naar gemachtigde
- Waarschuwingsgolf 7
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
voordynamic
.string
in plaats vanstring?
.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 naarint
. 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
enunchecked
controleren. De compiler genereert aanroepen naar de juiste variant op basis van de huidige context. Meer informatie over operators vindt u in het artikel overchecked
rekenkundige operatoren.
Numeriek en IntPtr
UIntPtr
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.