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.
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 null
må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
, out
eller 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.
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 GetCurrentOrder
koden 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