Nyheter i C# 10
C# 10 lägger till följande funktioner och förbättringar i C#-språket:
- Post structs
- Förbättringar av strukturtyper
- Interpolerade stränghanterare
global using
Direktiv- Namnområdesdeklaration med filomfattning
- Utökade egenskapsmönster
- Förbättringar av lambda-uttryck
- Tillåt
const
interpolerade strängar - Posttyper kan förseglas
ToString()
- Förbättrad bestämd tilldelning
- Tillåt både tilldelning och deklaration i samma dekonstruktion
- Tillåt
AsyncMethodBuilder
attribut för metoder - CallerArgumentExpression-attribut
- Förbättrad
#line
pragma - Varningsvåg 6
C# 10 stöds på .NET 6. Mer information finns i C#-språkversioner.
Du kan ladda ned den senaste .NET 6 SDK:en från nedladdningssidan för .NET. Du kan också ladda ned Visual Studio 2022, som innehåller .NET 6 SDK.
Kommentar
Vi är intresserade av din feedback om dessa funktioner. Om du får problem med någon av dessa nya funktioner skapar du ett nytt problem på dotnet/roslyn-lagringsplatsen .
Post structs
Du kan deklarera värdetypsposter med hjälp av record struct
deklarationerna eller readonly record struct
. Nu kan du klargöra att en record
är en referenstyp med deklarationen record class
.
Förbättringar av strukturtyper
C# 10 introducerar följande förbättringar som rör strukturtyper:
- Du kan deklarera en instansparameterlös konstruktor i en strukturtyp och initiera ett instansfält eller en egenskap i deklarationen. Mer information finns i avsnittet Struct-initiering och standardvärden i artikeln Strukturtyper .
- En vänsteroperation av
with
uttrycket kan vara av valfri strukturtyp eller en anonym (referenstyp).
Interpolerad stränghanterare
Du kan skapa en typ som skapar den resulterande strängen från ett interpolerat stränguttryck. .NET-biblioteken använder den här funktionen i många API:er. Du kan skapa en genom att följa den här självstudien.
Globala användningsdirektiv
Du kan lägga till global
modifieraren i alla användningsdirektiv för att instruera kompilatorn att direktivet gäller för alla källfiler i kompilering. Detta är vanligtvis alla källfiler i ett projekt.
Namnområdesdeklaration med filomfattning
Du kan använda en ny form av deklarationen namespace
för att deklarera att alla deklarationer som följer är medlemmar i det deklarerade namnområdet:
namespace MyNamespace;
Den här nya syntaxen sparar både vågrätt och lodrätt utrymme för namespace
deklarationer.
Utökade egenskapsmönster
Från och med C# 10 kan du referera till kapslade egenskaper eller fält i ett egenskapsmönster. Till exempel ett mönster i formuläret
{ Prop1.Prop2: pattern }
är giltigt i C# 10 och senare och motsvarar
{ Prop1: { Prop2: pattern } }
giltigt i C# 8.0 och senare.
Mer information finns i funktionsförslaget för utökade egenskapsmönster . Mer information om ett egenskapsmönster finns i avsnittet Egenskapsmönster i artikeln Mönster.
Förbättringar av Lambda-uttryck
C# 10 innehåller många förbättringar av hur lambda-uttryck hanteras:
- Lambda-uttryck kan ha en naturlig typ, där kompilatorn kan härleda en delegattyp från lambda-uttrycket eller metodgruppen.
- Lambda-uttryck kan deklarera en returtyp när kompilatorn inte kan härleda den.
- Attribut kan tillämpas på lambda-uttryck.
De här funktionerna gör lambda-uttryck mer lika metoder och lokala funktioner. De gör det enklare att använda lambda-uttryck utan att deklarera en variabel av en delegattyp, och de fungerar smidigare med de nya ASP.NET Core Minimal-API:er.
Konstanta interpolerade strängar
I C# 10 const
kan strängar initieras med hjälp av stränginterpolation om alla platshållare själva är konstanta strängar. Stränginterpolation kan skapa mer läsbara konstanta strängar när du skapar konstanta strängar som används i ditt program. Platshållaruttrycken kan inte vara numeriska konstanter eftersom dessa konstanter konverteras till strängar vid körning. Den aktuella kulturen kan påverka deras strängrepresentation. Läs mer i språkreferensen för const
uttryck.
Posttyper kan försegla ToString
I C# 10 kan du lägga till sealed
modifieraren när du åsidosätter ToString
i en posttyp. Genom att ToString
försegla metoden hindras kompilatorn från att syntetisera en ToString
metod för härledda posttyper. A sealed
ToString
säkerställer att alla härledda posttyper använder metoden ToString
som definierats i en gemensam basposttyp. Du kan läsa mer om den här funktionen i artikeln om poster.
Tilldelning och deklaration i samma dekonstruktion
Den här ändringen tar bort en begränsning från tidigare versioner av C#. Tidigare kunde en dekonstruktion tilldela alla värden till befintliga variabler eller initiera nyligen deklarerade variabler:
// Initialization:
(int x, int y) = point;
// assignment:
int x1 = 0;
int y1 = 0;
(x1, y1) = point;
C# 10 tar bort den här begränsningen:
int x = 0;
(x, int y) = point;
Förbättrad bestämd tilldelning
Före C# 10 fanns det många scenarier där slutgiltig tilldelning och null-tillståndsanalys gav varningar som var falska positiva. Dessa omfattade vanligtvis jämförelser med booleska konstanter, åtkomst till en variabel endast i -instruktionen true
eller false
i en if
-instruktion och null-sammansmältningsuttryck. Dessa exempel genererade varningar i tidigare versioner av C#, men inte i 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
}
Den största effekten av den här förbättringen är att varningarna för slutgiltig tilldelning och null-tillståndsanalys är mer exakta.
Tillåt attributet AsyncMethodBuilder på metoder
I C# 10 och senare kan du ange en annan asynkron metodbyggare för en enda metod, förutom att ange metodverktygets typ för alla metoder som returnerar en viss aktivitetsliknande typ. En anpassad asynkron metodbyggare möjliggör avancerade scenarier för prestandajustering där en viss metod kan dra nytta av en anpassad byggare.
Mer information finns i avsnittet i AsyncMethodBuilder
artikeln om attribut som lästs av kompilatorn.
CallerArgumentExpression-attributdiagnostik
Du kan använda System.Runtime.CompilerServices.CallerArgumentExpressionAttribute för att ange en parameter som kompilatorn ersätter med textrepresentationen av ett annat argument. Med den här funktionen kan bibliotek skapa mer specifik diagnostik. Följande kod testar ett villkor. Om villkoret är falskt innehåller undantagsmeddelandet textrepresentationen av argumentet som skickas till condition
:
public static void Validate(bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
if (!condition)
{
throw new InvalidOperationException($"Argument failed validation: <{message}>");
}
}
Du kan läsa mer om den här funktionen i artikeln om informationsattribut för uppringare i språkreferensavsnittet.
Förbättrad #line pragma
C# 10 stöder ett nytt format för #line
pragma. Du kommer förmodligen inte att använda det nya formatet, men du ser dess effekter. Förbättringarna möjliggör mer detaljerade utdata i domänspecifika språk (DSL:er) som Razor. Razor-motorn använder dessa förbättringar för att förbättra felsökningsupplevelsen. Du hittar felsökningsprogram som kan markera Razor-källan mer exakt. Mer information om den nya syntaxen finns i artikeln om preprocessordirektiv i språkreferensen. Du kan också läsa funktionsspecifikationen för Razor-baserade exempel.