Novinky v jazyce C# 12
C# 12 obsahuje následující nové funkce. Tyto funkce můžete vyzkoušet pomocí nejnovější verze sady Visual Studio 2022 nebo sady .NET 8 SDK.
Primární konstruktory – představené ve Visual Studio 2022 verze 17.6 Preview 2.
Výrazy kolekce – představené ve Visual Studio 2022 verze 17.7 Preview 5.
Vložená pole – uvedená v sadě Visual Studio 2022 verze 17.7 Preview 3.
Volitelné parametry ve výrazech lambda – byly představeny v programu Visual Studio 2022 ve verzi 17.5 Preview 2.
ref readonly
parametry – představené v sadě Visual Studio 2022 verze 17.8 Preview 2.Alias libovolného typu – představeno ve Visual Studio 2022 verze 17.6 Preview 3.
Experimentální atribut – představený v sadě Visual Studio 2022 verze 17.7 Preview 3.
Zachytávače - Náhled funkce představené v sadě Visual Studio 2022 verze 17.7 Preview 3.
C# 12 je podporován v .NET 8. Další informace najdete v tématu verzování jazyka C#.
Nejnovější .NET 8 SDK si můžete stáhnout z webové stránky ke stažení .NET. Můžete si také stáhnout Visual Studio 2022, která zahrnuje sadu .NET 8 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 nový problém v úložišti dotnet/roslyn.
Primární konstruktory
Nyní můžete vytvářet primární konstruktory v libovolném class
a struct
. Primární konstruktory už nejsou omezeny na typy record
. Parametry primárního konstruktoru jsou v dosahu pro celé tělo třídy. Aby bylo zajištěno, že všechny parametry primárního konstruktoru jsou rozhodně přiřazeny, musí všechny explicitně deklarované konstruktory volat primární konstruktor pomocí this()
syntaxe. Přidání primárního konstruktoru do class
brání kompilátoru v deklarování implicitního konstruktoru bez parametrů. V struct
implicitní konstruktor bez parametrů inicializuje všechna pole, včetně parametrů primárního konstruktoru na 0bitový vzor.
Kompilátor generuje pouze veřejné vlastnosti pro parametry primárního konstruktoru v record
typech, buď typu record class
, nebo record struct
. Nezáznamové třídy a struktury nemusí vždy chtít toto chování pro parametry primárního konstruktoru.
Více se o primárních konstruktorech můžete dozvědět v kurzu zaměřeném na zkoumání primárních konstruktorů a také v článku o konstruktorech instance .
Výrazy kolekce
Výrazy kolekce představují novou stručnou syntaxi pro vytvoření běžných hodnot kolekce. Vložení dalších kolekcí do těchto hodnot je možné pomocí rozprostřeného prvku ..e
.
Lze vytvořit několik typů připomínajících kolekce bez nutnosti externí podpory BCL. Mezi tyto typy patří:
- Typy polí, například
int[]
. - System.Span<T> a System.ReadOnlySpan<T>.
- Typy podporující inicializátory kolekce, například System.Collections.Generic.List<T>.
Následující příklady ukazují použití výrazů kolekce:
// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];
// Create a list:
List<string> b = ["one", "two", "three"];
// Create a span
Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];
// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];
Element spread, ..e
ve výrazu kolekce přidá všechny prvky v daném výrazu. Argumentem musí být typ kolekce. Následující příklady ukazují, jak funguje element spread:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{
Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,
Element spread vyhodnocuje každý prvek výrazu výčtu. Každý prvek je součástí výstupní kolekce.
Výrazy kolekce můžete používat kdekoli, kde potřebujete kolekci prvků. Mohou zadat počáteční hodnotu kolekce nebo být předány jako argumenty metodám, které přebírají typy kolekcí. Další informace o výrazech kolekce najdete v referenčním článku jazyka o výrazech kolekce nebo specifikaci funkce .
parametry ref readonly
Jazyk C# přidal in
parametry jako způsob předávání odkazů jen pro čtení.
in
parametry umožňují proměnné i hodnoty a lze je použít bez jakékoli poznámky k argumentům.
Přidání parametrů ref readonly
umožňuje větší srozumitelnost pro rozhraní API, která mohou používat parametry ref
nebo in
.
- Rozhraní API vytvořená před zavedením
in
můžou používatref
i když se argument nezmění. Tato rozhraní API je možné aktualizovat pomocíref readonly
. Nebude to zásadní změna pro volající, stejně jako kdyby se parametrref
změnil nain
. Příkladem je System.Runtime.InteropServices.Marshal.QueryInterface. - Rozhraní API, která přebírají parametr
in
, ale logicky vyžadují proměnnou. Výraz hodnoty nefunguje. Příkladem je System.ReadOnlySpan<T>.ReadOnlySpan<T>(T). - Rozhraní API, která používají
ref
, protože vyžadují proměnnou, ale tuto proměnnou nemění. Příkladem je System.Runtime.CompilerServices.Unsafe.IsNullRef.
Další informace o parametrech ref readonly
najdete v článku o modifikátorech parametrů v jazykové příručce nebo ve specifikaci funkce parametrů jen pro čtení .
Výchozí parametry lambda
Teď můžete definovat výchozí hodnoty parametrů pro výrazy lambda. Syntaxe a pravidla jsou stejná jako přidání výchozích hodnot argumentů do jakékoli metody nebo místní funkce.
Najdete další informace o výchozích parametrech na výrazy lambda v článku o výrazech lambda.
Alias libovolného typu
Direktivu aliasu using
můžete použít k aliasu libovolného typu, nikoli pouze pojmenovaných typů. To znamená, že můžete vytvořit sémantické aliasy pro typy n-tic, typy polí, typy ukazatelů nebo jiné nebezpečné typy. Další informace naleznete ve specifikaci funkce . Příklad názorného postupu refaktoringu najdete v tématu Refaktoring kódu pomocí aliasu libovolného typu na blogu .NET.
Vložená pole
Vložená pole používá tým modulu runtime a další autoři knihoven pro zefektivnění výkonu vašich aplikací. Vložená pole umožňují vývojáři vytvořit v typu struct
pole s pevnou velikostí. Struktura s vloženou vyrovnávací pamětí by měla poskytovat charakteristiky výkonu podobné nebezpečné vyrovnávací paměti pevné velikosti. Pravděpodobně nebudete deklarovat vlastní inline pole, ale bezproblémově je použijete, když jsou vystavené jako System.Span<T> nebo System.ReadOnlySpan<T> objekty z runtime API rozhraní.
vložené pole je deklarováno podobně jako následující struct
:
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
private int _element0;
}
Použijete je stejně jako jakékoli jiné pole:
var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
buffer[i] = i;
}
foreach (var i in buffer)
{
Console.WriteLine(i);
}
Rozdíl je v tom, že kompilátor může využít známé informace o inlinovém poli. Vložená pole pravděpodobně budete používat stejně jako jakákoli jiná pole. Pro více informací o tom, jak deklarovat vložená pole, se podívejte na jazykovou referenci týkající se typů struct
.
Experimentální atribut
Typy, metody nebo sestavení lze označit System.Diagnostics.CodeAnalysis.ExperimentalAttribute, aby bylo možné indikovat experimentální funkci. Kompilátor vydá upozornění, pokud přistupujete k metodě nebo typu označenému ExperimentalAttribute. Všechny typy zahrnuté v sestavení označeném atributem Experimental
jsou experimentální. Další informace najdete v článku o obecné atributy přečtené kompilátoremnebo specifikace funkce .
Průsečíky
Varování
Průsečíky jsou experimentální funkce, která je dostupná v režimu Preview s C# 12. Tato funkce může v budoucí verzi podléhat zásadním změnám nebo odebrání. Proto se nedoporučuje pro produkční nebo vydané aplikace.
Aby bylo možné použít průsečíky, musí projekt uživatele zadat vlastnost <InterceptorsPreviewNamespaces>
. Toto je seznam jmenných prostorů, které mohou obsahovat zachytávače.
Příklad: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>
průsečíku je metoda, která může deklarativním způsobem nahradit volání zachytitelné metodou s voláním v době kompilace. K této náhradě dochází tak, že průsečík deklaruje zdrojová umístění volání, která zachycuje. Průsečíky poskytují omezenou možnost změny sémantiky existujícího kódu přidáním nového kódu do kompilace, například ve zdrojovém generátoru.
Jako součást zdrojového generátoru použijete zachytávač k modifikaci kódu existující kompilace zdroje, spíše než abyste do ní přidávali nový kód. Generátor kódu nahrazuje volání zachytávatelné metody voláním metody interceptoru .
Pokud chcete experimentovat se zachytávači, můžete se dozvědět více přečtením si specifikace funkce. Pokud tuto funkci používáte, nezapomeňte mít aktuální informace o všech změnách ve specifikaci funkce pro tuto experimentální funkci. Pokud je funkce dokončená, přidáme na tento web další pokyny.