Novinky v jazyce C# 10

Jazyk C# 10 přidá do jazyka C# následující funkce a vylepšení:

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