Nieuw in C# 13
C# 13 bevat de volgende nieuwe functies. U kunt deze functies proberen met behulp van de nieuwste versie van Visual Studio 2022 of de .NET 9 SDK:
-
params
verzamelingen -
nieuwe
lock
type en semantiek. -
Nieuwe escapereeks -
\e
. - Methode-groep natuurlijke typeverbeteringen
- impliciete indexeerfunctietoegang in object-initialisatiefuncties
-
ref
lokale bevolking enunsafe
contexten in iterators en asynchrone methoden inschakelen -
ref struct
typen inschakelen om interfaceste implementeren. - Ref struct-types toestaan als argumenten voor typeparameters in generics.
-
gedeeltelijke eigenschappen en indexeerfuncties zijn nu toegestaan in
partial
typen. - Prioriteit van overbelastingsresolutie stelt bibliotheekauteurs in staat om één overbelasting aan te wijzen als beter dan andere.
Vanaf Visual Studio 17.12 bevat C# 13 het field
contextuele trefwoord als preview-functie.
C# 13 wordt ondersteund op .NET 9. Zie C#-taalversiebeheervoor meer informatie.
U kunt de nieuwste .NET 9 SDK downloaden vanaf de .NET-downloadspagina. U kunt ook Visual Studio 2022downloaden, waaronder de .NET 9 SDK.
Nieuwe functies worden toegevoegd aan de pagina 'Wat is er nieuw in C#' wanneer deze beschikbaar zijn in openbare preview-versies. De werksetsectie van de roslyn-functiestatuspagina houdt bij wanneer toekomstige functies worden samengevoegd in de hoofdtak.
U kunt alle ingrijpende veranderingen die zijn geïntroduceerd in C# 13 vinden in ons artikel over ingrijpende veranderingen.
Notitie
We zijn geïnteresseerd in uw feedback over deze functies. Als u problemen ondervindt met deze nieuwe functies, maakt u een nieuw probleem in de dotnet/roslyn repository.
verzamelingen params
De params
modifier is niet beperkt tot matrixtypen. U kunt nu params
gebruiken met elk herkend verzamelingstype, waaronder System.Span<T>, System.ReadOnlySpan<T>en typen die System.Collections.Generic.IEnumerable<T> implementeren en een Add
methode hebben. Naast betontypen kunnen de interfaces System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.ICollection<T>en System.Collections.Generic.IList<T> ook worden gebruikt.
Wanneer een interfacetype wordt gebruikt,synthetiseert de compiler de opslag voor de opgegeven argumenten. Meer informatie vindt u in de functiespecificatie voor params
verzamelingen.
Methodedeclaraties kunnen bijvoorbeeld spanen declareren als params
parameters:
public void Concat<T>(params ReadOnlySpan<T> items)
{
for (int i = 0; i < items.Length; i++)
{
Console.Write(items[i]);
Console.Write(" ");
}
Console.WriteLine();
}
Nieuw vergrendelingsobject
De .NET 9-runtime bevat een nieuw type voor threadsynchronisatie, het System.Threading.Lock type. Dit type biedt een betere threadsynchronisatie via de API. De methode Lock.EnterScope() voert een exclusief bereik in. De ref struct
, die het Dispose()
-patroon ondersteunt, wordt geretourneerd om het exclusieve bereik te verlaten.
De instructie C# lock
herkent of het doel van de vergrendeling een Lock
-object is. Zo ja, dan wordt de bijgewerkte API gebruikt in plaats van de traditionele API met behulp van System.Threading.Monitor. De compiler herkent ook als u een Lock
-object converteert naar een ander type en de op Monitor
gebaseerde code wordt gegenereerd. Meer informatie vindt u in de functiespecificatie voor het nieuwe vergrendelingsobject.
Met deze functie kunt u de voordelen van het nieuwe bibliotheektype krijgen door het type object dat u lock
te wijzigen. Er hoeft geen andere code te worden gewijzigd.
Nieuwe escapereeks
U kunt \e
gebruiken als een letterlijk teken-escapereeks voor het ESCAPE
-teken, Unicode U+001B
. Eerder hebt u \u001b
of \x1b
gebruikt. Het gebruik van \x1b
werd niet aanbevolen omdat als de volgende tekens na 1b
geldige hexadecimale cijfers waren, deze tekens deel uitmaakten van de escape-reeks.
Methodegroep natuurlijke type
Deze functie maakt kleine optimalisaties tot overbelastingsresolutie met behulp van methodegroepen. Een methodegroep is een methode en alle overbelastingen met dezelfde naam. Het vorige gedrag was voor de compiler om de volledige set kandidaatmethoden voor een methodegroep samen te stellen. Als een natuurlijk type nodig was, werd het natuurlijke type bepaald op basis van de volledige set kandidaatmethoden.
Het nieuwe gedrag is dat de set kandidaatmethoden bij elk bereik wordt ingeperkt, waarbij de kandidaatmethoden die niet van toepassing zijn, worden verwijderd. Meestal zijn de verwijderde methoden generieke methoden met de verkeerde ariteit of beperkingen die niet worden voldaan. Het proces gaat alleen door naar het volgende buitenste bereik als er geen kandidaatmethoden worden gevonden. Dit proces volgt het algemene algoritme voor overbelastingsresolutie nauwkeuriger. Als alle kandidaatmethoden in een bepaald bereik niet overeenkomen, heeft de methodegroep geen natuurlijk type.
U kunt de details van de wijzigingen in de voorstelspecificatielezen.
Impliciete indextoegang
De impliciete indexoperator 'van het einde', ^
, is nu toegestaan in een object initializer-expressie. U kunt nu bijvoorbeeld een matrix initialiseren in een object-initialisatiefunctie, zoals wordt weergegeven in de volgende code:
var countdown = new TimerRemaining()
{
buffer =
{
[^1] = 0,
[^2] = 1,
[^3] = 2,
[^4] = 3,
[^5] = 4,
[^6] = 5,
[^7] = 6,
[^8] = 7,
[^9] = 8,
[^10] = 9
}
};
In het voorgaande voorbeeld wordt een matrix gemaakt die aftelt van 9 tot 0. In versies vóór C# 13 kan de operator ^
niet worden gebruikt in een object-initialisatiefunctie. Je moet de elementen vanaf de voorkant indexeren.
ref
en unsafe
in iterators en async
methoden
Met deze functie en de volgende twee functies kunnen ref struct
typen nieuwe constructies gebruiken. Je zult deze niet gebruiken, tenzij je je eigen ref struct
typen schrijft. Waarschijnlijker ziet u een indirect voordeel als System.Span<T> en System.ReadOnlySpan<T> meer functionaliteit krijgt.
Vóór C# 13 konden iteratormethoden (methoden die gebruikmaken van yield return
) en async
methoden geen lokale ref
variabelen declareren en konden ze ook geen unsafe
context hebben.
In C# 13 kunnen async
methoden ref
lokale variabelen of lokale variabelen van een ref struct
type declareren. Deze variabelen kunnen echter niet worden geopend over een await
grens. Ze kunnen niet worden geopend over een yield return
grens.
Deze versoepelde beperking stelt de compiler in staat om het verifieerbaar veilige gebruik van ref
lokale variabelen en ref struct
typen op meer plaatsen toe te staan. U kunt veilig typen zoals System.ReadOnlySpan<T> in deze methoden gebruiken. De compiler geeft aan of u de veiligheidsregels schendt.
Op dezelfde manier maakt C# 13 unsafe
contexten in iteratormethoden mogelijk. Alle yield return
- en yield break
-instructies moeten zich echter in veilige contexten bevinden.
allows ref struct
Voor C# 13 konden ref struct
typen niet worden gedeclareerd als het typeargument voor een algemeen type of methode. Nu kunnen algemene typedeclaraties een antibeperking toevoegen, allows ref struct
. Met deze antibeperking wordt aangegeven dat het typeargument dat is opgegeven voor die typeparameter een ref struct
type kan zijn. De compiler dwingt referentie-veiligheidsregels af voor alle exemplaren van die type parameter.
U kunt bijvoorbeeld een algemeen type als de volgende code declareren:
public class C<T> where T : allows ref struct
{
// Use T as a ref struct:
public void M(scoped T p)
{
// The parameter p must follow ref safety rules
}
}
Hierdoor kunnen typen zoals System.Span<T> en System.ReadOnlySpan<T> worden gebruikt met algemene algoritmen, indien van toepassing. Meer informatie vindt u in de updates voor where
en in het artikel in de programmeerhandleiding over algemene beperkingen.
ref struct
interfaces
Vóór C# 13 waren ref struct
typen niet toegestaan om interfaces te implementeren. Vanaf C# 13 kunnen ze dat. U kunt declareren dat een ref struct
type een interface implementeert. Om veiligheidsregels voor ref te garanderen, kan een ref struct
type echter niet worden geconverteerd naar een interfacetype. Deze conversie is een boksconversie en kan de veiligheid van ref schenden. Met deze regel kunnen ref struct
typen geen methoden declareren die expliciet een interfacemethode implementeren. Bovendien moeten ref struct
typen alle methoden implementeren die zijn gedeclareerd in een interface, inclusief methoden met een standaard implementatie.
Meer informatie in de updates over ,ref struct
type.
Meer gedeeltelijke leden
U kunt partial
eigenschappen en partial
indexeerfuncties declareren in C# 13. Gedeeltelijke eigenschappen en indexeerfuncties volgen over het algemeen dezelfde regels als partial
methodes: je maakt één verklarende declaratie en één uitvoerende declaratie. De handtekeningen van de twee declaraties moeten overeenkomen. Een beperking is dat u geen automatische eigenschapsdeclaratie kunt gebruiken voor het implementeren van een gedeeltelijke eigenschap. Eigenschappen die geen body declareren, worden gezien als de declaratie.
public partial class C
{
// Declaring declaration
public partial string Name { get; set; }
}
public partial class C
{
// implementation declaration:
private string _name;
public partial string Name
{
get => _name;
set => _name = value;
}
}
Meer informatie vindt u in het artikel over de gedeeltelijke leden van .
Prioriteit van overbelastingsresolutie
In C# 13 herkent de compiler de OverloadResolutionPriorityAttribute de voorkeur te geven aan een overbelasting boven een andere. Auteurs van bibliotheken kunnen dit kenmerk gebruiken om ervoor te zorgen dat een nieuwe, betere overbelasting de voorkeur heeft boven een bestaande overbelasting. U kunt bijvoorbeeld een nieuwe overbelasting toevoegen die beter presteert. U wilt geen bestaande code verbreken die gebruikmaakt van uw bibliotheek, maar u wilt dat gebruikers bijwerken naar de nieuwe versie wanneer ze opnieuw worden gecompileren. U kunt prioriteit voor overbelastingsresolutie gebruiken om de compiler te informeren welke overbelasting de voorkeur moet hebben. Overbelastingen met de hoogste prioriteit hebben de voorkeur.
Deze functie is bedoeld voor bibliotheekauteurs om dubbelzinnigheid te voorkomen bij het toevoegen van nieuwe overbelastingen. Auteurs van bibliotheken moeten voorzichtig zijn met dit kenmerk om verwarring te voorkomen.
Het trefwoord field
Het field
contextuele trefwoord bevindt zich in C# 13 als preview-functie. Het token field
verleent toegang tot het gesynthetiseerde achterveld van de compiler in een eigenschapstoeganger. Hiermee kunt u een accessorlid schrijven zonder een expliciet achterliggend veld in uw typedeclaratie te definiëren. U kunt een body of implementatie opgeven voor een of beide accessors van een eigenschap met veldondersteuning.
De field
-functie wordt uitgebracht als preview-functie. We willen leren van uw ervaringen met het gebruik ervan. Er is een mogelijke wijziging die fouten veroorzaakt of verwarring bij het lezen van code in typen die ook een veld met de naam field
bevatten. U kunt @field
of this.field
gebruiken om onderscheid te maken tussen het field
trefwoord en de id.
Belangrijk
Het field
trefwoord is een preview-functie in C# 13. U moet .NET 9 gebruiken en het <LangVersion>
element instellen op preview
in uw projectbestand om het contextuele trefwoord field
te kunnen gebruiken.
Wees voorzichtig met het gebruik van de functie field
trefwoord in een klasse met een veld met de naam field
. Het nieuwe field
trefwoord schaduwt een veld met de naam field
binnen de scope van een eigenschapstoegangsmethode. U kunt de naam van de field
variabele wijzigen of het @
token gebruiken om te verwijzen naar de field
-id als @field
. Meer informatie vindt u door de functiespecificatie voor het field
trefwoordte lezen.
Als u deze functie probeert en feedback hebt, voegt u deze toe aan het feature issue in de csharplang
repository.