Delen via


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:

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 lockte 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 \x1bgebruikt. 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 fieldbevatten. 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.

Zie ook