Co je nového v jazyce C# 10

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

Další funkce jsou k dispozici v režimu náhledu. Doporučujeme vám vyzkoušet si tyto funkce a poskytnout k nim zpětnou vazbu. Před finální verzí se mohou změnit. Abyste mohli tyto funkce používat, musíte ve svém projektu nastavit <LangVersion> Preview na . Další informace o obecných atributech si můžete přečíst dále v tomto článku.

Jazyk C# 10 se podporuje v .NET 6. Další informace najdete v tématu o verzích jazyka C#.

Nejnovější sadu .NET 6 SDK si můžete stáhnout ze stránky pro stažení .NET. Můžete si také stáhnout Visual Studio 2022,který zahrnuje sadu .NET 6 SDK.

Record – struktury

Záznamy hodnot typu můžete deklarovat pomocí record struct readonly record struct deklarací nebo. Nyní můžete objasnit, record že je odkazový typ s record class deklarací.

Vylepšení typů struktur

Jazyk C# 10 přináší následující vylepšení související s typy struktur:

  • Konstruktor bez parametrů instance můžete deklarovat v typu struktury a inicializovat pole instance nebo vlastnost na jeho deklaraci. Další informace najdete v části Konstruktory bez parametrů a inicializátory polí článku Typy struktur.
  • Levý operand výrazu with může být libovolného typu struktury nebo anonymního (referenčního) typu.

Obslužná rutina interpolovaného řetězce

Můžete vytvořit typ, který sestaví výsledný řetězec z interpolovaného řetězcové 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 do libovolné direktivy using, která kompilátoru instruuje, že direktiva se vztahuje na všechny zdrojové global soubory v kompilaci. Obvykle se jedná o všechny zdrojové soubory v projektu.

Deklarace oborů názvů v souboru

Pomocí nové formy deklarace namespace můžete deklarovat, že všechny následující deklarace jsou členy deklarovaného oboru názvů:

namespace MyNamespace;

Tato nová syntaxe šetří pro deklarace vodorovný i namespace svislý prostor.

Vzory rozšířených vlastností

Počínaje jazykem C# 10 můžete odkazovat na vnořené vlastnosti nebo pole v rámci vzoru vlastností. Například vzor formuláře

{ Prop1.Prop2: pattern }

je platný v jazyce C# 10 a novějším a odpovídá

{ Prop1: { Prop2: pattern } }

platí v jazyce C# 8.0 a novějším.

Další informace najdete v poznámce k návrhu funkce Rozšířené vzory vlastností. Další informace o vzorech vlastností najdete v části Vzory vlastností v článku Vzory.

Vylepšení výrazu lambda

Jazyk C# 10 obsahuje mnoho 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átu z výrazu lambda nebo skupiny metod.
  • Výrazy lambda mohou deklarovat návratový typ, když ho kompilátor nemůže odvodit.
  • Atributy lze použít u výrazů lambda.

Tyto funkce jsou výrazy lambda více podobné metodám a místním funkcím. Usnadňují použití výrazů lambda bez deklarování proměnné typu delegátu a hladší práci s novými rozhraními API ASP.NET Core Minimální.

Konstantní interpolované řetězce

V jazyce C# 10 mohou být řetězce inicializovány pomocí interpolace řetězců, pokud jsou všechny zástupné symboly const samy konstantními řetězci. Interpolace řetězců může vytvářet čitelné konstantní řetězce při vytváření konstantních řetězců používaných ve vaší aplikaci. Zástupné výrazy nemůže 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ězcové vyjádření. Další informace najdete v referenčních informacích k const jazyku pro výrazy.

Typy záznamů mohou zapečetět toString

V jazyce C# 10 můžete přidat modifikátor při přepsání sealed ToString v typu záznamu. ToStringZapečetění metody zabrání kompilátoru v syntetizaci metody ToString pro všechny odvozené typy záznamů. Zajišťuje, sealed ToString že všechny typy odvozených záznamů používají ToString metodu 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;

Jazyk C# 10 odebere toto omezení:

int x = 0;
(x, int y) = point;

Vylepšené konečné přiřazení

Před C# 10 bylo mnoho scénářů, kdy konečné přiřazení a analýza stavu null vyprodukoval upozornění, která byla falešně pozitivní. Obecně to zahrnovalo porovnání s logickými konstantami, přístup k proměnné pouze v příkazech nebo a true false if výrazy nulového salescingu. 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 konečné přiřazení a analýzu stavu null jsou přesnější.

Povolení atributu AsyncMethodBuilder u metod

V jazyce C# 10 a novějších verzích můžete pro jednu metodu zadat jiný tvůrce asynchronních metod, kromě určení typu tvůrce metod pro všechny metody, které vracejí daný typ typu jako úkol. Tvůrce vlastních asynchronních metod umožňuje pokročilé scénáře ladění výkonu, ve kterých může konkrétní metoda využívat výhod vlastního tvůrce.

Další informace najdete v části v článku AsyncMethodBuilder o atributech, které čte kompilátor.

Diagnostika atributu CallerArgumentExpression

Pomocí můžete System.Runtime.CompilerServices.CallerArgumentExpressionAttribute zadat parametr, který kompilátor nahradí textovou reprezentací 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 false, zpráva výjimky obsahuje textovou reprezentaci argumentu předané condition do :

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 části Referenční informace o jazyce.

Vylepšená #line pragma

Jazyk C# 10 podporuje nový formát #line pro direktivu pragma. Nový formát pravděpodobně nebudete používat, ale uvidíte jeho účinky. Tato vylepšení umožňují podrobnější výstup v jazycích specifických pro doménu, jako je Razor. Modul Razor používá tato vylepšení ke zlepšení prostředí ladění. Zjistíte, že ladicí program dokáže přesněji zvýraznit váš zdroj Razor. Další informace o nové syntaxi najdete v článku o direktivách preprocesoru v referenčních informacích k jazyku. Můžete si také přečíst specifikaci funkce pro příklady založené na Razor.

Obecné atributy

Důležité

Obecné atributy jsou funkcí preview. Pokud chcete tuto funkci <LangVersion> povolit, Preview musíte nastavit na . Tato funkce se může před finální verzí změnit.

Můžete deklarovat obecnou třídu, jejíž základní třída je System.Attribute . To poskytuje pohodlnější syntaxi pro atributy, které vyžadují System.Type parametr. Dříve byste potřebovali vytvořit atribut, který přebírá jako Type parametr konstruktoru :

public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

A k použití atributu použijete operátor typeof :

[TypeAttribute(typeof(string))]
public string Method() => default;

Pomocí této nové funkce můžete místo toho vytvořit obecný atribut:

public class GenericAttribute<T> : Attribute { }

Pak zadejte parametr typu pro použití atributu :

[GenericAttribute<string>()]
public string Method() => default;

Můžete použít plně uzavřený obecný atribut. Jinými slovy musí být zadány všechny parametry typu. Například následující možnosti nejsou povoleny:

public class GenericType<T>
{
   [GenericAttribute<T>()] // Not allowed! generic attributes must be fully closed types.
   public string Method() => default;
}

Argumenty typu musí splňovat stejná omezení jako typeof operátor . Typy, které vyžadují poznámky metadat, nejsou povoleny. Mezi příklady patří:

  • dynamic
  • nint, nuint
  • string? (nebo jakýkoli odkaz s možnou hodnotou null)
  • (int X, int Y) (nebo jiné typy řazené kolekce členů používající syntaxi řazené kolekce členů v jazyce C#).

Tyto typy nejsou v metadatech reprezentovány přímo. Obsahují poznámky, které popisují typ. Ve všech případech můžete místo toho použít základní typ:

  • object pro dynamic .
  • IntPtr místo nint nebo unint .
  • string místo string? .
  • ValueTuple<int, int> místo (int X, int Y) .