Dela via


Nyheter i C# 10

C# 10 lägger till följande funktioner och förbättringar i C#-språket:

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 problemdotnet/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:

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 sealedToString 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.