Wat is er nieuw in C# 10
C# 10 voegt de volgende functies en verbeteringen toe aan de C#-taal:
- Structs opnemen
- Verbeteringen van structuurtypen
- Geïnterpoleerde tekenreekshandlers
global using
Richtlijnen- Declaratie van bestandsbereiknaamruimte
- Uitgebreide eigenschapspatronen
- Verbeteringen in lambda-expressies
- Geïnterpoleerde tekenreeksen toestaan
const
- Recordtypen kunnen worden afgesloten
ToString()
- Verbeterde definitieve toewijzing
- Zowel toewijzing als declaratie in dezelfde destructie toestaan
- Kenmerk toestaan
AsyncMethodBuilder
voor methoden - Kenmerk CallerArgumentExpression
- Verbeterde
#line
pragma - Waarschuwingsgolf 6
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:
- U kunt een exemplaarparameterloze constructor declareren in een structuurtype en een exemplaarveld of eigenschap initialiseren bij de declaratie. Zie de sectie Struct initialisatie en standaardwaarden van het artikel Structuurtypen voor meer informatie.
- Een linkeroperand van de
with
expressie kan van elk structuurtype of een anoniem (verwijzingstype) zijn.
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 sealed
ToString
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.