Wat is er nieuw in C# 10

C# 10 voegt de volgende functies en verbeteringen toe aan de C#-taal:

C# 10 wordt ondersteund op .NET 6. Zie C#-taalversiebeheer voor meer informatie.

U kunt de nieuwste .NET 6 SDK downloaden via de .NET-downloadpagina. U kunt ook Visual Studio 2022 downloaden, waaronder de .NET 6 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 .

Structs opnemen

U kunt records van het waardetype declareren met behulp van de record struct of readonly record struct declaraties. U kunt nu verduidelijken dat een record verwijzingstype is met de record class declaratie.

Verbeteringen van structuurtypen

C# 10 introduceert de volgende verbeteringen met betrekking tot structuurtypen:

Geïnterpoleerde tekenreekshandler

U kunt een type maken waarmee de resulterende tekenreeks wordt gebouwd op basis van een geïnterpoleerde tekenreeksexpressie. De .NET-bibliotheken gebruiken deze functie in veel API's. U kunt er een bouwen door deze zelfstudie te volgen.

Globale gebruiksrichtlijnen

U kunt de global wijzigingsfunctie toevoegen aan elke gebruiksrichtlijn om de compiler te instrueren dat de richtlijn van toepassing is op alle bronbestanden in de compilatie. Dit zijn meestal alle bronbestanden in een project.

Declaratie van bestandsbereiknaamruimte

U kunt een nieuwe vorm van de namespace declaratie gebruiken om aan te geven dat alle declaraties die volgen lid zijn van de gedeclareerde naamruimte:

namespace MyNamespace;

Deze nieuwe syntaxis bespaart zowel horizontale als verticale ruimte voor namespace declaraties.

Uitgebreide eigenschapspatronen

Vanaf C# 10 kunt u verwijzen naar geneste eigenschappen of velden binnen een eigenschapspatroon. Bijvoorbeeld een patroon van het formulier

{ Prop1.Prop2: pattern }

is geldig in C# 10 en hoger en gelijk aan

{ Prop1: { Prop2: pattern } }

geldig in C# 8.0 en hoger.

Zie de uitgebreide notitie over eigenschappenpatronen voor uitgebreide eigenschappen voor meer informatie. Zie de sectie Eigenschapspatroon van het artikel Patronen voor meer informatie over een eigenschapspatroon.

Verbeteringen in lambda-expressies

C# 10 bevat veel verbeteringen voor de manier waarop lambda-expressies worden verwerkt:

  • Lambda-expressies kunnen een natuurlijk type hebben, waarbij de compiler een gemachtigdentype kan afleiden uit de lambda-expressie of methodegroep.
  • Lambda-expressies kunnen een retourtype declareren wanneer de compiler dit niet kan afleiden.
  • Kenmerken kunnen worden toegepast op lambda-expressies.

Deze functies maken lambda-expressies vergelijkbaarer met methoden en lokale functies. Ze maken het eenvoudiger om lambda-expressies te gebruiken zonder een variabele van een type gedelegeerde te declareren en ze werken naadloos samen met de nieuwe ASP.NET Core Minimale API's.

Constante geïnterpoleerde tekenreeksen

In C# 10 const kunnen tekenreeksen worden geïnitialiseerd met behulp van tekenreeksinterpolatie als alle tijdelijke aanduidingen zelf constante tekenreeksen zijn. Tekenreeksinterpolatie kan beter leesbare constante tekenreeksen maken terwijl u constante tekenreeksen bouwt die in uw toepassing worden gebruikt. De tijdelijke aanduidingen kunnen geen numerieke constanten zijn, omdat deze constanten tijdens runtime worden geconverteerd naar tekenreeksen. De huidige cultuur kan van invloed zijn op de tekenreeksweergave. Meer informatie in de taalreferentie over const expressies.

Recordtypen kunnen ToString verzegelen

In C# 10 kunt u de sealed wijzigingsfunctie toevoegen wanneer u het recordtype overschrijft ToString . Het verzegelen van de ToString methode voorkomt dat de compiler een ToString methode voor eventuele afgeleide recordtypensynthetiseert. A sealedToString zorgt ervoor dat alle afgeleide recordtypen de ToString methode gebruiken die is gedefinieerd in een gemeenschappelijk basisrecordtype. Meer informatie over deze functie vindt u in het artikel over records.

Toewijzing en declaratie in dezelfde deconstructie

Deze wijziging verwijdert een beperking uit eerdere versies van C#. Voorheen kon een deconstructie alle waarden toewijzen aan bestaande variabelen of zojuist gedeclareerde variabelen initialiseren:

// Initialization:
(int x, int y) = point;

// assignment:
int x1 = 0;
int y1 = 0;
(x1, y1) = point;

C# 10 verwijdert deze beperking:

int x = 0;
(x, int y) = point;

Verbeterde definitieve toewijzing

Vóór C# 10 waren er veel scenario's waarbij definitieve toewijzing en null-statusanalyse waarschuwingen leverden die fout-positieven waren. Deze hebben meestal betrekking op vergelijkingen met booleaanse constanten, waarbij alleen toegang wordt verkregen tot een variabele in de true instructie of false instructies in een if instructie en null-samensningsexpressies. In deze voorbeelden zijn waarschuwingen gegenereerd in eerdere versies van C#, maar niet in C# 10:

string representation = "N/A";
if ((c != null && c.GetDependentValue(out object obj)) == true)
{
   representation = obj.ToString(); // undesired error
}

// Or, using ?.
if (c?.GetDependentValue(out object obj) == true)
{
   representation = obj.ToString(); // undesired error
}

// Or, using ??
if (c?.GetDependentValue(out object obj) ?? false)
{
   representation = obj.ToString(); // undesired error
}

De belangrijkste impact van deze verbetering is dat de waarschuwingen voor definitieve toewijzing en null-statusanalyse nauwkeuriger zijn.

AsyncMethodBuilder-kenmerk toestaan op methoden

In C# 10 en hoger kunt u een andere opbouwfunctie voor asynchrone methoden opgeven voor één methode, naast het opgeven van het type opbouwfunctie voor methoden voor alle methoden die een bepaald type taak retourneren. Een aangepaste opbouwfunctie voor asynchrone methoden maakt geavanceerde scenario's mogelijk voor het afstemmen van prestaties waarbij een bepaalde methode kan profiteren van een aangepaste opbouwfunctie.

Zie de sectie in het artikel over AsyncMethodBuilder kenmerken die door de compiler worden gelezen voor meer informatie.

Diagnose van callerArgumentExpression-kenmerk

U kunt de System.Runtime.CompilerServices.CallerArgumentExpressionAttribute parameter opgeven die door de compiler wordt vervangen door de tekstweergave van een ander argument. Met deze functie kunnen bibliotheken specifiekere diagnostische gegevens maken. Met de volgende code wordt een voorwaarde getest. Als de voorwaarde onwaar is, bevat het uitzonderingsbericht de tekstweergave van het argument dat wordt doorgegeven aan condition:

public static void Validate(bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
    if (!condition)
    {
        throw new InvalidOperationException($"Argument failed validation: <{message}>");
    }
}

Meer informatie over deze functie vindt u in het artikel over aanroeperinformatiekenmerken in de sectie taalreferenties.

Uitgebreide #line pragma

C# 10 ondersteunt een nieuwe indeling voor de #line pragma. Waarschijnlijk gebruikt u niet de nieuwe indeling, maar ziet u de effecten. De verbeteringen zorgen voor meer verfijnde uitvoer in domeinspecifieke talen (DSL's), zoals Razor. De Razor-engine gebruikt deze verbeteringen om de foutopsporingservaring te verbeteren. U vindt dat foutopsporingsprogramma's uw Razor-bron nauwkeuriger kunnen markeren. Zie het artikel over Preprocessor-instructies in de taalverwijzing voor meer informatie over de nieuwe syntaxis. U kunt ook de functiespecificatie voor razor-voorbeelden lezen.