Läs på engelska

Dela via


Nyheter i C# 14

C# 14 innehåller följande nya funktioner. Du kan prova de här funktionerna med den senaste Visual Studio 2022-versionen eller .NET 10 SDK:

C# 14 stöds på .NET 10. Mer information finns i C#-språkversioner.

Du kan ladda ned den senaste .NET 10 SDK från nedladdningssidan för .NET. Du kan också ladda ned Visual Studio 2022, som innehåller .NET 10 SDK.

Nya funktioner läggs till på sidan "Nyheter i C#" när de är tillgängliga i offentliga förhandsversioner. Den arbetsuppsättningen delen av roslyn-funktionsstatussidan spårar när kommande funktioner slås samman till huvudgrenen. Den här artikeln uppdaterades senast för .NET 10 Preview 1.

Du hittar eventuella störande ändringar som introduceras i C# 14 i vår artikel som handlar om störande ändringar.

Anteckning

Vi är intresserade av din feedback om dessa funktioner. Om du stöter på problem med någon av dessa nya funktioner, skapa ett nytt problem i dotnet/roslyn repository.

Nyckelordet field

Med token field kan du skriva en egenskapsåtkomsttext utan att deklarera ett explicit bakgrundsfält. Token field ersätts med ett kompilatorsyntetiserat bakgrundsfält.

Om du till exempel tidigare ville se till att en string egenskap inte kunde anges till nullmåste du deklarera ett bakgrundsfält och implementera båda åtkomsterna:

private string _msg;
public string Message
{
    get => _msg;
    set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}

Nu kan du förenkla koden för att:

public string Message
{
    get;
    set => field = value ?? throw new ArgumentNullException(nameof(value));
}

Du kan deklarera en kropp för en eller båda accessorerna för en fältbaserad egenskap.

Det finns en potentiell förändring som bryter kompatibilitet eller förvirring vid kodläsning i typer som innehåller en symbol med namnet field. Du kan använda @field eller this.field för att skilja mellan nyckelordet field och identifieraren, eller så kan du byta namn på den aktuella field symbolen för att ge bättre skillnad.

Om du provar den här funktionen och har feedback kommenterar du funktionsproblemet på lagringsplatsen csharplang .

Det field kontextuella nyckelordet finns i C# 13 som en förhandsgranskningsfunktion.

Implicita intervallkonverteringar

C# 14 introducerar förstklassigt stöd för System.Span<T> och System.ReadOnlySpan<T> på språket. Det här stödet omfattar nya implicita konverteringar som möjliggör mer naturlig programmering med dessa typer.

Span<T> och ReadOnlySpan<T> används på många viktiga sätt i C# och körtiden. Introduktionen förbättrar prestandan utan att riskera säkerheten. C# 14 identifierar relationen och stöder vissa konverteringar mellan ReadOnlySpan<T>, Span<T>och T[]. Span-typerna kan vara tilläggsmetodmottagare, kombinera med andra konverteringar och hjälpa till med generiska typinferensscenarier.

Du hittar listan över implicita span-konverteringar i artikeln om inbyggda typer i språkreferensavsnittet. Du kan läsa mer information genom att läsa funktionsspecifikationen för first class span-typer.

Obundna generiska typer och nameof

Från och med C# 14 kan argumentet till nameof vara en obunden generisk typ. Till exempel utvärderas nameof(List<>) till List. I tidigare versioner av C#kunde endast stängda generiska typer, till exempel List<int>, användas för att returnera List namnet.

Enkla lambda-parametrar med modifierare

Du kan lägga till parametermodifierare, till exempel scoped, ref, in, outeller ref readonly till lambda-uttrycksparametrar utan att ange parametertypen:

delegate bool TryParse<T>(string text, out T result);
// ...
TryParse<int> parse1 = (text, out result) => Int32.TryParse(text, out result);

Tidigare tilläts endast tillägg av modifierare när parameterdeklarationerna inkluderade parametrarnas typer. Föregående deklaration skulle kräva typer på alla parametrar:

TryParse<int> parse2 = (string text, out int result) => Int32.TryParse(text, out result);

Modifieraren params kräver fortfarande en uttryckligen angiven parameterlista.

Du kan läsa mer om dessa ändringar i artikeln om lambda-uttryck i C#-språkreferensen.

Fler delvisa medlemmar

Nu kan du deklarera instanskonstruktorer och händelser som partiella medlemmar.

Partiella konstruktorer och partiella händelser måste innehålla exakt en definierande deklaration och en implementeringsdeklaration.

Endast implementeringsdeklarationen för en partiell konstruktor kan innehålla en konstruktorinitierare: this() eller base(). Endast en partiell typdeklaration kan innehålla den primära konstruktorsyntaxen.

Implementeringsdeklarationen för en partiell händelse måste innehålla add och remove accessorer. Den definierande deklarationen deklarerar en fältliknande händelse.

Nullvillkorsstyrd tilldelning

De nullvillkorsstyrda medlemsåtkomstoperatorerna, ?. och ``?[]`, kan nu användas på vänstersidan av en tilldelning eller sammansatt tilldelning.

Innan C# 14 måste du null-kontrollera en variabel innan du tilldelar till en egenskap:

if (customer is not null)
{
    customer.Order = GetCurrentOrder();
}

Du kan förenkla föregående kod med hjälp av operatorn ?. :

customer?.Order = GetCurrentOrder();

Operatorns = högra sida utvärderas endast när den vänstra sidan inte är null. Om customer är null anropar GetCurrentOrderkoden inte .

Förutom tilldelning kan du använda null-operatorer för villkorlig medlemsåtkomst med sammansatta tilldelningsoperatorer (+=, -=och andra). Men inkrement och dekrement, ++ och --, är inte tillåtna.

Du kan läsa mer i språkreferensartikeln om villkorlig medlemsåtkomst och funktionsspecifikationen för villkorsstyrd nulltilldelning

Se även


Ytterligare resurser

Dokumentation