Novinky v jazyce C# 11

V jazyce C# 11 byly přidány následující funkce:

C# 11 je podporován v .NET 7. Další informace najdete v tématu Správa verzí jazyka C#.

Nejnovější sadu .NET 7 SDK 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 7 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.

Obecné atributy

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

// Before C# 11:
public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

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

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

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

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

Pak zadejte parametr typu, který má atribut použít:

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

Při použití atributu je nutné zadat všechny parametry typu. Jinými slovy, obecný typ musí být plně sestaven. V příkladu výše lze prázdné závorky (( a )) vynechat, protože atribut neobsahuje žádné argumenty.

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

Argumenty typu musí splňovat stejná omezení jako typeof operátor. Typy, které vyžadují poznámky metadat, nejsou povolené. Jako parametr typu například nejsou povoleny následující typy:

  • dynamic
  • string? (nebo jakýkoli typ odkazu s možnou hodnotou null)
  • (int X, int Y) (nebo jakékoli jiné typy řazené kolekce členů pomocí syntaxe řazené kolekce členů jazyka C#).

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

  • object pro dynamic.
  • stringstring?místo .
  • ValueTuple<int, int>(int X, int Y)místo .

Obecná podpora matematiky

Existuje několik jazykových funkcí, které umožňují podporu obecných matematických operací:

  • static virtual členy v rozhraních
  • zaškrtnuté uživatelem definované operátory
  • operátory uvolněné směny
  • unsigned right-shift – operátor

V rozhraních můžete přidat static abstract nebo static virtual členy definovat rozhraní, která zahrnují přetížitelné operátory, další statické členy a statické vlastnosti. Primárním scénářem této funkce je použití matematických operátorů v obecných typech. Můžete například implementovat System.IAdditionOperators<TSelf, TOther, TResult> rozhraní v typu, který implementuje operator +. Jiná rozhraní definují jiné matematické operace nebo dobře definované hodnoty. O nové syntaxi se dozvíte v článku o rozhraních. Rozhraní, která obsahují static virtual metody, jsou obvykle obecná rozhraní. Většina navíc deklaruje omezení, které parametr typu implementuje deklarované rozhraní.

Další informace a vyzkoušet si tuto funkci můžete sami v kurzu Prozkoumat členy statického abstraktního rozhraní nebo funkce Preview v .NET 6 – obecný matematický blogový příspěvek.

Obecná matematika vytvořila další požadavky na jazyk.

  • Operátor posunu doprava bez znaménka: Před C# 11 vynutit posun bez znaménka byste museli přetypovat libovolný typ celého čísla se znaménkem na nepodepsaný typ, provést směnu a potom přetypovat výsledek zpět na typ znaménka. Počínaje jazykem C# 11 můžete použít >>>operátor posunu bez znaménka.
  • uvolněné požadavky operátoru posunu: C# 11 odebere požadavek, aby druhý operand musel být int nebo implicitně konvertibilní na int. Tato změna umožňuje použití typů, které implementují obecná matematická rozhraní v těchto umístěních.
  • zaškrtnuté a nezaškrtnuté uživatelem definované operátory: Vývojáři teď mohou definovat checked aritmetické unchecked operátory. Kompilátor generuje volání správné varianty na základě aktuálního kontextu. Další informace o checked operátorech najdete v článku o Aritmetických operátorech.

Číselné IntPtr a UIntPtr

nuint A nint typy teď alias System.IntPtr a System.UIntPtr, v uvedeném pořadí.

Newlines in string interpolations

Text uvnitř { a } znaky pro interpolaci řetězců teď může obsahovat více řádků. Text mezi značkami { a } značkami se parsuje jako C#. Je povolen jakýkoli právní jazyk C#, včetně novýchřádků. Tato funkce usnadňuje čtení interpolací řetězců, které používají delší výrazy jazyka C#, jako jsou porovnávání switch vzorů nebo dotazy LINQ.

Další informace o funkci newlines najdete v článku o interpolacích řetězců v referenční dokumentaci jazyka.

Vzory seznamů

Vzory seznamů rozšiřují porovnávání vzorů tak, aby odpovídaly sekvenci prvků v seznamu nebo matici. Je truesequence to například pole sequence is [1, 2, 3] nebo seznam tří celých čísel (1, 2 a 3). Prvky můžete spárovat pomocí libovolného vzoru, včetně konstanty, typu, vlastnosti a relačních vzorů. Vzor zahození (_) odpovídá jakémukoli jednomu prvku a nový vzor rozsahu (..) odpovídá libovolné sekvenci nulových nebo více prvků.

Další podrobnosti o vzorech seznamů najdete v článku o porovnávání vzorů v referenční dokumentaci jazyka.

Vylepšený převod skupiny metod na delegáta

Standard jazyka C# pro převody skupin metod teď obsahuje následující položku:

  • Převod je povolen (ale není vyžadován) k použití existující instance delegáta, která již tyto odkazy obsahuje.

Předchozí verze standardu zakázaly kompilátoru znovu použít delegovaný objekt vytvořený pro převod skupiny metod. Kompilátor C# 11 ukládá objekt delegáta vytvořený z převodu skupiny metod do mezipaměti a znovu použije tento objekt delegáta. Tato funkce byla poprvé dostupná v sadě Visual Studio 2022 verze 17.2 jako funkce Preview a v .NET 7 Preview 2.

Nezpracované řetězcové literály

Nezpracované řetězcové literály jsou novým formátem pro řetězcové literály. Nezpracované řetězcové literály můžou obsahovat libovolný text, včetně prázdných znaků, nových řádků, vložených uvozovek a dalších speciálních znaků bez nutnosti řídicích sekvencí. Nezpracovaný řetězcový literál začíná alespoň třemi znaky s dvojitou uvozovkou ("""). Končí stejným počtem dvou uvozovek. Nezpracovaný řetězcový literál používá k zahájení řetězce tři dvojité uvozovky na jednom řádku a tři dvojité uvozovky na samostatném řádku pro ukončení řetězce. Do konečného obsahu se nezahrnou nové řádky za levou uvozovkou a před závěrečnou uvozovkou:

string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

Všechny prázdné znaky vlevo od uzavíracích dvojitých uvozovek budou z řetězcového literálu odebrány. Nezpracované řetězcové literály lze kombinovat s interpolací řetězců, aby se do výstupního textu zahrnuly složené závorky. Více $ znaků označuje, kolik po sobě jdoucích složených závorek začíná a končí interpolaci:

var location = $$"""
   You are at {{{Longitude}}, {{Latitude}}}
   """;

Předchozí příklad určuje, že dvě složené závorky začínají a končí interpolaci. Třetí opakovaná levá a pravá složená závorka je součástí výstupního řetězce.

Další informace o nezpracovaných řetězcových literálech najdete v článku o řetězcích v průvodci programováním a o referenčních článcích jazyka o řetězcových literálech a interpolovaných řetězcích.

Automatická výchozí struktura

Kompilátor C# 11 zajišťuje, že se všechna pole struct typu inicializují na výchozí hodnotu v rámci provádění konstruktoru. Tato změna znamená, že kompilátor automaticky inicializuje jakékoli pole nebo automatickou vlastnost, které konstruktor neinicializuje. Struktury, ve kterých konstruktor rozhodně nepřiřazuje všechna pole, se teď kompilují a všechna pole, která nejsou explicitně inicializována, jsou nastavena na výchozí hodnotu. Další informace o tom, jak tato změna ovlivňuje inicializaci struktury, najdete v článku o strukturách.

Shoda Span<char> vzorů nebo ReadOnlySpan<char> konstanta string

Podařilo se vám otestovat, jestli string má určitá konstantní hodnota pomocí porovnávání vzorů pro několik verzí. Nyní můžete použít stejnou logiku porovnávání vzorů s proměnnými, které jsou Span<char> nebo ReadOnlySpan<char>.

Rozšířený název oboru

Názvy parametrů typu a názvy parametrů jsou nyní v oboru, pokud se používají ve výrazu nameof v deklaraci atributu pro danou metodu. Tato funkce znamená, že pomocí operátoru nameof můžete zadat název parametru metody v atributu pro deklaraci metody nebo parametru. Tato funkce je nejčastěji užitečná pro přidání atributů pro analýzu s možnou hodnotou null.

Řetězcové literály UTF-8

Příponu řetězcového literálu u8 můžete zadat pro kódování znaků UTF-8. Pokud vaše aplikace potřebuje řetězce UTF-8, pro řetězcové konstanty HTTP nebo podobné textové protokoly, můžete tuto funkci použít ke zjednodušení vytváření řetězců UTF-8.

Další informace o řetězcových literálech UTF-8 najdete v části řetězcového literálu článku o integrovaných odkazových typech.

Požadované členy

K vlastnostem a polím můžete přidat required modifikátor , který vynucuje konstruktory a volající k inicializaci těchto hodnot. Lze System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute přidat do konstruktorů, aby informoval kompilátor, že konstruktor inicializuje všechny požadované členy.

Další informace o požadovanýchčlench

ref pole a ref scoped proměnné

Můžete deklarovat ref pole uvnitř .ref struct To podporuje typy, jako System.Span<T> jsou bez speciálních atributů nebo skrytých interních typů.

Modifikátor můžete přidat scoped do jakékoli ref deklarace. Tím omezíte rozsah , na který může odkaz utéct.

Místní typy souborů

Počínaje jazykem C# 11 můžete pomocí modifikátoru file přístupu vytvořit typ, jehož viditelnost je vymezena na zdrojový soubor, ve kterém je deklarován. Tato funkce pomáhá autorům generátoru zdrojů vyhnout se kolizím názvů. Další informace o této funkci najdete v článku o typech v oboru souborů v referenční dokumentaci jazyka.

Viz také