Novinky v jazyce C# 10
Jazyk C# 10 přidá do jazyka C# následující funkce a vylepšení:
- Struktury záznamů
- Vylepšení typů struktur
- Interpolované obslužné rutiny řetězců
global using
Směrnic- Deklarace oboru názvů v oboru souborů
- Vzory rozšířených vlastností
- Vylepšení výrazů lambda
- Povolit
const
interpolované řetězce - Typy záznamů můžou zapečetit
ToString()
- Vylepšené určité přiřazení
- Povolit přiřazení i deklaraci ve stejné dekonstrukci
- Povolit
AsyncMethodBuilder
atribut u metod - CallerArgumentExpression – atribut
- Rozšířená direktiva
#line
pragma - Výstražná vlna 6
C# 10 je podporován v .NET 6. Další informace najdete v tématu Správa verzí jazyka C#.
Nejnovější sadu .NET SDK 6 si můžete stáhnout ze stránky pro stahování .NET. Můžete si také stáhnout Sadu Visual Studio 2022, která zahrnuje sadu .NET 6 SDK.
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 v úložišti dotnet/roslyn nový problém.
Struktury záznamů
Záznamy typu hodnoty můžete deklarovat pomocí record struct
deklarací nebo readonly record struct
deklarací. Teď můžete objasnit, že jde o record
typ odkazu s deklarací record class
.
Vylepšení typů struktur
C# 10 zavádí následující vylepšení související s typy struktur:
- Můžete deklarovat konstruktor bez parametrů instance v typu struktury a inicializovat pole instance nebo vlastnost v jeho deklaraci. Další informace naleznete v části Inicializace struktury a výchozí hodnoty v článku Typy struktur.
- Levý operand výrazu
with
může být libovolného typu struktury nebo anonymního typu (odkaz).
Interpolovaná obslužná rutina řetězců
Můžete vytvořit typ, který vytvoří výsledný řetězec z interpolovaného řetězcového výrazu. Knihovny .NET tuto funkci používají v mnoha rozhraních API. Můžete ho vytvořit podle tohoto kurzu.
Globální direktivy using
Modifikátor můžete přidat global
do jakékoli direktivy using, která kompilátoru dává pokyn, aby direktiva platila pro všechny zdrojové soubory v kompilaci. Obvykle se jedná o všechny zdrojové soubory v projektu.
Deklarace oboru názvů v oboru souborů
Pomocí nové formy namespace
deklarace můžete deklarovat, že všechny následující deklarace jsou členy deklarovaného oboru názvů:
namespace MyNamespace;
Tato nová syntaxe šetří vodorovné i svislé místo pro namespace
deklarace.
Vzory rozšířených vlastností
Počínaje jazykem C# 10 můžete odkazovat na vnořené vlastnosti nebo pole v rámci vzoru vlastnosti. Například vzor formuláře
{ Prop1.Prop2: pattern }
je platný v jazyce C# 10 a novějším a odpovídá
{ Prop1: { Prop2: pattern } }
platné v jazyce C# 8.0 a novějším.
Další informace najdete v poznámce k návrhu funkcí rozšířených vzorů vlastností. Další informace o vzoru vlastností naleznete v části Vzor vlastnosti v článku Vzory.
Vylepšení výrazů lambda
C# 10 obsahuje řadu vylepšení způsobu zpracování výrazů lambda:
- Výrazy lambda mohou mít přirozený typ, kde kompilátor může odvodit typ delegáta z výrazu lambda nebo skupiny metod.
- Výrazy lambda můžou deklarovat návratový typ , když ho kompilátor nemůže odvodit.
- Atributy lze použít u výrazů lambda.
Díky těmto funkcím se výrazy lambda podobaly metodám a místním funkcím. Usnadňují používání výrazů lambda bez deklarování proměnné typu delegáta a bezproblémově pracují s novými rozhraními ASP.NET Core Minimal API.
Konstantní interpolované řetězce
V jazyce C# 10 mohou být řetězce inicializovány pomocí interpolace řetězců, const
pokud jsou všechny zástupné symboly samy o sobě konstantní řetězce. Interpolace řetězců může při vytváření konstantních řetězců používaných v aplikaci vytvářet čitelnější konstantní řetězce. Zástupné výrazy nemohou být číselné konstanty, protože tyto konstanty jsou převedeny na řetězce za běhu. Aktuální jazyková verze může ovlivnit jejich řetězcovou reprezentaci. Další informace najdete v referenčních informacích k jazyku ve const
výrazech.
Typy záznamů můžou zapečetit ToString
V jazyce C# 10 můžete modifikátor přidat sealed
při přepsání ToString
v typu záznamu. ToString
Zapečetění metody brání kompilátoru v syntetizaci ToString
metody pro všechny odvozené typy záznamů. A sealed
ToString
zajišťuje, že všechny odvozené typy záznamů používají metodu ToString
definovanou v běžném základním typu záznamu. Další informace o této funkci najdete v článku o záznamech.
Přiřazení a deklarace ve stejné dekonstrukci
Tato změna odebere omezení ze starších verzí jazyka C#. Dekonstrukce dříve mohla přiřadit všechny hodnoty existujícím proměnným nebo inicializovat nově deklarované proměnné:
// Initialization:
(int x, int y) = point;
// assignment:
int x1 = 0;
int y1 = 0;
(x1, y1) = point;
C# 10 odebere toto omezení:
int x = 0;
(x, int y) = point;
Vylepšené určité přiřazení
Před C# 10 došlo k mnoha scénářům, kdy určité přiřazení a analýza stavu null generovaly upozornění, která byla falešně pozitivní. Obvykle se jedná o porovnání s logickými konstantami, přístupem k proměnné pouze v true
příkazech nebo false
příkazech v if
příkazu a shodným výrazem null. Tyto příklady vygenerovaly upozornění v předchozích verzích jazyka C#, ale ne v jazyce 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
}
Hlavním dopadem tohoto vylepšení je, že upozornění pro konkrétní přiřazení a analýzu stavu null jsou přesnější.
Povolit atribut AsyncMethodBuilder u metod
V jazyce C# 10 a novějším můžete kromě zadání typu tvůrce metod zadat pro všechny metody, které vracejí daný typ podobný úkolu, jiný asynchronní tvůrce metod. Tvůrce vlastních asynchronních metod umožňuje pokročilé scénáře ladění výkonu, ve kterých může daná metoda těžit z vlastního tvůrce.
Další informace najdete v části AsyncMethodBuilder
v článku o atributech přečtených kompilátorem.
Diagnostika atributů CallerArgumentExpression
Můžete použít System.Runtime.CompilerServices.CallerArgumentExpressionAttribute k určení parametru, který kompilátor nahradí textovým vyjádřením jiného argumentu. Tato funkce umožňuje knihovnám vytvářet konkrétnější diagnostiku. Následující kód testuje podmínku. Pokud je podmínka nepravda, zpráva o výjimce obsahuje textovou reprezentaci argumentu předaného condition
:
public static void Validate(bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
if (!condition)
{
throw new InvalidOperationException($"Argument failed validation: <{message}>");
}
}
Další informace o této funkci najdete v článku o atributech informací o volajícím v referenční části jazyka.
Rozšířená direktiva pragma #line
C# 10 podporuje nový formát direktivy #line
pragma. Pravděpodobně nebudete používat nový formát, ale uvidíte jeho efekty. Vylepšení umožňují jemněji odstupňovaný výstup v jazycích specifických pro doménu (DSLS), jako je Razor. Modul Razor používá tato vylepšení ke zlepšení prostředí ladění. Ladicí programy můžou zdroj Razor zvýraznit přesněji. Další informace o nové syntaxi najdete v článku o direktivách preprocesoru v referenční dokumentaci jazyka. Můžete si také přečíst specifikaci funkce pro příklady založené na Razoru.