Novinky v jazyce C# 11
V jazyce C# 11 byly přidány následující funkce:
- Nezpracované řetězcové literály
- Obecná podpora matematiky
- Obecné atributy
- Řetězcové literály UTF-8
- Newlines in string interpolation expressions
- Vzory seznamů
- Místní typy souborů
- Požadované členy
- Automatické výchozí struktury
- Shoda
Span<char>
vzorů u konstantystring
- Rozšířený
nameof
obor - Numeric IntPtr
ref
pole ascoped ref
- Vylepšený převod skupiny metod na delegáta
- Výstražná vlna 7
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
prodynamic
.string
string?
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í naint
. 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 ochecked
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 true
sequence
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.