Novinky v jazyce C# 13
C# 13 obsahuje následující nové funkce. Tyto funkce můžete vyzkoušet pomocí nejnovější verze sady Visual Studio 2022 nebo sady .NET 9 SDK:
-
params
kolekce -
Nový typ
lock
a sémantika. -
Nová řídicí sekvence -
\e
. - vylepšení přirozeného typu skupiny
- implicitní přístup indexeru v inicializátorech objektů
-
Povolení místních
ref
a kontextůunsafe
v iterátorech a asynchronních metodách -
Povolit typy
ref struct
implementovat rozhraní. - Povolit strukturované typy ref jako argumenty pro parametry typu v generických typech.
-
Částečné vlastnosti a indexery jsou teď povolené v typech
partial
. - Priorita rozlišení přetížení umožňuje autorům knihoven určit jedno přetížení jako lepší než ostatní.
Počínaje sadou Visual Studio 17.12 obsahuje verze jazyka C# 13 kontextové klíčové slovo field
jako předběžnou funkci.
C# 13 je podporován v .NET 9. Další informace naleznete v tématu verzování jazyka C#.
Nejnovější sadu .NET 9 SDK si můžete stáhnout ze stránky pro stahování .NET. Můžete si také stáhnout Visual Studio 2022, která zahrnuje sadu .NET 9 SDK.
Nové funkce se přidají na stránku Co je nového v jazyce C#, když jsou dostupné ve verzích Public Preview. Oddíl pracovní sady stránce stavu funkce roslyn sleduje, kdy se nadcházející funkce sloučí do hlavní větve.
Všechny zásadní změny představené v C# 13 najdete v našem článku o zásadních změn.
Poznámka
Zajímá nás vaše názory na tyto funkce. Pokud zjistíte problémy s některou z těchto nových funkcí, vytvořte nový problém v úložišti dotnet/roslyn.
kolekce params
Modifikátor params
není omezen na typy polí. Nyní můžete použít params
s libovolným rozpoznaným typem kolekce, včetně System.Span<T>, System.ReadOnlySpan<T>a typů, které implementují System.Collections.Generic.IEnumerable<T> a mají Add
metodu. Kromě konkrétních typů lze také použít rozhraní System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.ICollection<T>a System.Collections.Generic.IList<T>.
Při použití typu rozhraní kompilátor syntetizuje úložiště pro zadané argumenty. Další informace najdete ve specifikaci funkce pro kolekce params
.
Deklarace metody mohou například deklarovat rozsahy jako parametry params
:
public void Concat<T>(params ReadOnlySpan<T> items)
{
for (int i = 0; i < items.Length; i++)
{
Console.Write(items[i]);
Console.Write(" ");
}
Console.WriteLine();
}
Nový objekt zámku
Modul runtime .NET 9 obsahuje nový typ pro synchronizaci vláken, typ System.Threading.Lock. Tento typ poskytuje lepší synchronizaci vláken prostřednictvím svého rozhraní API. Metoda Lock.EnterScope() zadá výhradní obor.
ref struct
vrácená z podporuje vzor Dispose()
k opuštění výhradního rozsahu.
Příkaz lock
jazyka C# rozpozná, jestli je cílem zámku Lock
objekt. Pokud ano, používá aktualizované rozhraní API místo tradičního rozhraní API pomocí System.Threading.Monitor. Kompilátor také rozpozná, jestli převedete objekt Lock
na jiný typ a vygeneruje se kód založený na Monitor
. Další informace najdete ve specifikaci funkce pro nový objekt zámku.
Tato funkce umožňuje získat výhody nového typu knihovny změnou typu objektu, který lock
. Žádný jiný kód se nemusí měnit.
Nová escape sekvence
Jako literál znaku můžete použít řídicí sekvenci\e
pro znak ESCAPE
, Unicode U+001B
. Dříve jste použili \u001b
nebo \x1b
. Použití \x1b
se nedoporučuje, protože pokud znaky následující po 1b
byly platné šestnáctkové číslice, staly se součástí escape sekvence.
Přirozený typ skupiny metod
Tato funkce provádí malé optimalizace pro přetížení rozlišení zahrnující skupiny metod. Skupina metod zahrnuje metodu a všechna její přetížení se stejným názvem. Předchozí chování bylo pro kompilátor vytvořit úplnou sadu kandidátských metod pro skupinu metod. Pokud byl nutný přirozený typ, byl přirozený typ určen z celé sady kandidátských metod.
Nové chování spočívá v vyřazení sady kandidátských metod v každém oboru a odebráním metod kandidáta, které nejsou použitelné. Odebrané metody jsou obvykle generické metody s nesprávnou aritou nebo omezeními, která nejsou splněna. Proces pokračuje k dalšímu vnějšímu oboru pouze v případě, že nejsou nalezeny žádné kandidátní metody. Tento proces se podrobněji řídí obecným algoritmem pro řešení přetížení. Pokud se všechny kandidátské metody nalezené v daném oboru neshoduje, skupina metod nemá přirozený typ.
Můžete si přečíst podrobnosti o změnách ve specifikaci návrhu .
Implicitní přístup k indexu
Implicitní operátor indexu "od konce" ^
je nyní povolen ve výrazu inicializátoru objektu. Teď můžete například inicializovat pole v inicializátoru objektů, jak je znázorněno v následujícím kódu:
public class TimerRemaining
{
public int[] buffer { get; set; } = new int[10];
}
var countdown = new TimerRemaining()
{
buffer =
{
[^1] = 0,
[^2] = 1,
[^3] = 2,
[^4] = 3,
[^5] = 4,
[^6] = 5,
[^7] = 6,
[^8] = 7,
[^9] = 8,
[^10] = 9
}
};
Třída TimerRemaining
obsahuje pole buffer
inicializované na délku 10. Předchozí příklad přiřadí hodnoty k tomuto poli pomocí operátoru indexu "from the end" (^
), čímž se efektivně vytvoří pole, které počítá od 9 do 0.
Ve verzích před C# 13 nelze operátor ^
použít v inicializátoru objektů. Musíte indexovat prvky od začátku.
ref
a unsafe
v iterátorech a metodách async
Tato funkce a následující dvě funkce umožňují ref struct
typům používat nové konstrukce. Tyto typy nebudete používat, pokud nenapíšete vlastní typy ref struct
. Pravděpodobněji uvidíte nepřímý přínos, jakmile System.Span<T> a System.ReadOnlySpan<T> získají další funkce.
Před jazykem C# 13 nemohly metody iterátoru (metody používající yield return
) a async
metody deklarovat místní proměnné ref
ani nemohly mít unsafe
kontext.
V jazyce C# 13 mohou metody async
deklarovat místní proměnné ref
, nebo takové, které jsou typu ref struct
. K těmto proměnným ale není možné přistupovat přes await
hranice. K nim není možné přistupovat přes hranice yield return
.
Toto uvolněné omezení umožňuje kompilátoru ověřitelně bezpečné použití ref
místních proměnných a ref struct
typů na více místech. V těchto metodách můžete bezpečně používat typy, jako je System.ReadOnlySpan<T>. Kompilátor vám řekne, jestli porušujete bezpečnostní pravidla.
Stejným způsobem umožňuje C# 13 kontexty unsafe
v metodách iterátoru. Všechny příkazy yield return
a yield break
však musí být v bezpečných kontextech.
allows ref struct
Před jazykem C# 13 nelze ref struct
typy deklarovat jako argument typu pro obecný typ nebo metodu. Nyní mohou deklarace obecného typu přidat omezení ve tvaru "anti-constraint", allows ref struct
. Deklarace antiomezení uvádí, že argument typu zadaný pro tento parametr typu může být typ ref struct
. Kompilátor vynucuje pravidla bezpečnosti ref pro všechny instance tohoto parametru typu.
Můžete například deklarovat obecný typ jako následující kód:
public class C<T> where T : allows ref struct
{
// Use T as a ref struct:
public void M(scoped T p)
{
// The parameter p must follow ref safety rules
}
}
To umožňuje použití typů, jako jsou System.Span<T> a System.ReadOnlySpan<T>, s obecnými algoritmy, pokud je to možné. Můžete se dozvědět více v aktualizacích pro where
a v článku v programovacím průvodci o obecných omezeních .
rozhraní ref struct
Před jazykem C# 13 nebyly ref struct
typy povoleny k implementaci rozhraní. Počínaje verzí C# 13, můžou. Můžete deklarovat, že ref struct
typ implementuje rozhraní. Aby se však zajistila bezpečnostní pravidla ref, typ ref struct
nelze převést na typ rozhraní. Tento převod je převod boxingu a mohl by narušit bezpečnost ref. Z tohoto pravidla ref struct
typy nemůžou deklarovat metody, které explicitně implementují metodu rozhraní. Také musí typy ref struct
implementovat všechny metody deklarované v rozhraní, včetně těch metod s výchozí implementací.
Zjistěte více v aktualizacích o typech ref struct
.
Více částečných členů
V jazyce C# 13 můžete deklarovat vlastnosti partial
a indexery partial
. Částečné vlastnosti a indexery obecně dodržují stejná pravidla jako partial
metody: vytvoříte jednu deklarující deklaraci a jednu implementaci deklarace. Podpisy dvou deklarací se musí shodovat. Jedním z omezení je, že pro implementaci částečné vlastnosti nemůžete použít deklaraci automatické vlastnosti. Vlastnosti, které nedeklarují tělo, se považují za deklarující deklaraci.
public partial class C
{
// Declaring declaration
public partial string Name { get; set; }
}
public partial class C
{
// implementation declaration:
private string _name;
public partial string Name
{
get => _name;
set => _name = value;
}
}
Další informace najdete v článku o částečných členech .
Priorita rozlišení přetížení
V jazyce C# 13 kompilátor rozpozná směrnici OverloadResolutionPriorityAttribute, která upřednostňuje jedno přetížení před jiným. Autoři knihoven můžou tento atribut použít k zajištění, že nové, lepší přetížení je upřednostňované před existujícím přetížením. Můžete například přidat nové přetížení, které je výkonnější. Nechcete přerušit stávající kód, který používá vaši knihovnu, ale chcete, aby se uživatelé při opětovném kompilaci aktualizovali na novou verzi. Prioritu rozlišení přetížení můžete použít k informování kompilátoru, které přetížení by mělo být upřednostňované. Přetížení s nejvyšší prioritou mají přednost.
Tato funkce je určená autorům knihoven, aby se zabránilo nejednoznačnosti při přidávání nových přetížení. Autoři knihoven by měli opatrně používat tento atribut, aby nedošlo k nedorozumění.
Klíčové slovo field
Kontextové klíčové slovo field
je v jazyce C# 13 k dispozici jako ukázková funkce. Token field
přistupuje k syntetizovanému poli kompilátoru v přístupovém objektu vlastnosti. Umožňuje psát tělo akcesoru bez deklarování explicitního podkladového pole v deklaraci typu. Můžete deklarovat tělo pro jeden nebo oba přístupové objekty pro vlastnost s podporou pole.
Funkce field
je vydána jako funkce ve verzi Preview. Chceme se učit z vašich zkušeností s používáním. Existuje potenciální změna způsobující chybu nebo nejasnost čtení kódu v typech, které také obsahují pole s názvem field
. K nejednoznačnosti mezi klíčovým slovem field
a identifikátorem můžete použít @field
nebo this.field
.
Důležitý
Klíčové slovo field
je funkce preview v jazyce C# 13. Pokud chcete použít kontextové klíčové slovo field
, musíte použít .NET 9 a nastavit prvek <LangVersion>
na preview
v souboru projektu.
Při použití funkce klíčového slova field
ve třídě, která má pole s názvem field
, byste měli být opatrní. Nové klíčové slovo field
stínuje pole s názvem field
v rámci přístupového modifikátoru vlastnosti. Můžete změnit název proměnné field
nebo pomocí tokenu @
odkazovat na identifikátor field
jako @field
. Další informace se dozvíte přečtením specifikace funkce pro klíčové slovo field
.
Pokud tuto funkci vyzkoušíte a máte zpětnou vazbu, přidejte tuto zpětnou vazbu do problému funkce v úložišti csharplang
.