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é v sadě Visual Studio 2022 verze 17.6 Preview 2.
Výrazy kolekce – zavedeny v sadě Visual Studio 2022 verze 17.7 Preview 5.
Vložená pole – představeno v sadě Visual Studio 2022 verze 17.7 Preview 3.
Volitelné parametry ve výrazech lambda – představené v sadě Visual Studio 2022 verze 17.5 Preview 2.
ref readonly
parameters – představeno v sadě Visual Studio 2022 verze 17.8 Preview 2.Alias libovolného typu – představený v sadě Visual Studio 2022 verze 17.6 Preview 3
Experimentální atribut – představený v sadě Visual Studio 2022 verze 17.7 Preview 3
Funkce Interceptors - Preview 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 Správa verzí jazyka C#.
Nejnovější sadu .NET SDK 8 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 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 v úložišti dotnet/roslyn nový problém.
Primární konstruktory
Nyní můžete vytvořit primární konstruktory v libovolné class
a struct
. Primární konstruktory už nejsou omezeny na record
typy. Parametry primárního konstruktoru jsou v oboru pro celý text 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 objektu class
brání kompilátoru v deklarování implicitního konstruktoru bez parametrů. struct
Implicitní konstruktor bez parametrů inicializuje všechna pole včetně parametrů primárního konstruktoru na 0bitový vzor.
Kompilátor generuje veřejné vlastnosti pro parametry primárního konstruktoru pouze v record
typech nebo record class
record struct
typech. Nezáznamové třídy a struktury nemusí vždy chtít toto chování pro parametry primárního konstruktoru.
Další informace o primárních konstruktorech najdete v kurzu pro zkoumání primárních konstruktorů a v článku o konstruktorech instancí.
Výrazy kolekce
Výrazy kolekce představují novou syntaxi terse pro vytvoření běžných hodnot kolekce. Vložení dalších kolekcí do těchto hodnot je možné pomocí operátoru ..
rozprostření .
Můžete vytvořit několik typů podobných kolekcím bez nutnosti externí podpory seznamu BCL. Mezi tyto typy patří:
- Typy polí, například
int[]
. - System.Span<T> a System.ReadOnlySpan<T>.
- Typy, které podporují 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];
Operátor spread..
ve výrazu kolekce nahradí svůj argument prvky z této kolekce. Argumentem musí být typ kolekce. Následující příklady ukazují, jak funguje operátor šíření:
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,
Operand operátoru rozprostření je výraz, který lze vytvořit výčtem. Operátor spread vyhodnocuje každý prvek výrazu výčtu.
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 ovýrazch
ref readonly
Parametry
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í ref readonly
parametrů umožňuje srozumitelnější pro rozhraní API, která můžou používat ref
parametry nebo in
parametry:
- Rozhraní API vytvořená před
in
zavedením 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 kdybyref
se parametr změnil nain
. Příklad: System.Runtime.InteropServices.Marshal.QueryInterface. - Rozhraní API, která přebírají
in
parametr, ale logicky vyžadují proměnnou. Výraz hodnoty nefunguje. Příklad: System.ReadOnlySpan<T>.ReadOnlySpan<T>(T). - Rozhraní API, která používají
ref
, protože vyžadují proměnnou, ale neztlumují tuto proměnnou. Příklad: System.Runtime.CompilerServices.Unsafe.IsNullRef.
Další informace o ref readonly
parametrech najdete v článku o modifikátorech parametrů v referenční dokumentaci jazyka nebo 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.
Další informace o výchozíchparametrch
Alias libovolného typu
Direktivu aliasu můžete použít k aliasu libovolného using
typu, nejen pojmenovaných typů. To znamená, že můžete vytvořit sémantické aliasy pro typy řazené kolekce členů, typy polí, typy ukazatelů nebo jiné nebezpečné typy. Další informace najdete ve specifikaci funkce.
Vložená pole
Vložená pole používají tým modulu runtime a další autoři knihoven ke zlepšení výkonu vašich aplikací. Vložená pole umožňují vývojáři vytvořit pole s pevnou struct
velikostí v typu. 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í vložená pole, ale transparentně je použijete, když budou vystaveny jako System.Span<T> nebo System.ReadOnlySpan<T> objekty z rozhraní API modulu runtime.
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žívat známé informace o vložené matici. Vložená pole pravděpodobně budete používat stejně jako jakákoli jiná pole. Další informace o deklarování vložených polí najdete v referenčních informacích jazyka k struct
typům.
Experimentální atribut
Typy, metody nebo sestavení lze označit pomocí System.Diagnostics.CodeAnalysis.ExperimentalAttribute označení experimentální funkce. Kompilátor vydá upozornění, pokud přistupujete k metodě nebo zadáte poznámky s příponou ExperimentalAttribute. Všechny typy zahrnuté v sestavení označeném atributem Experimental
jsou experimentální. Další informace najdete v článku o obecných atributech přečtených kompilátorem nebo specifikací funkce.
Zachycovače
Upozorňující
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 oborů názvů, které mohou obsahovat průsečíky.
Příklad: <InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>
Průsečík je metoda, která může deklarativním způsobem nahradit volání zachycovatelné metody voláním samotného 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.
Průsečík použijete jako součást zdrojového generátoru k úpravě, nikoli k přidání kódu do existující kompilace zdroje. Zdrojový generátor nahrazuje volání zachycovatelné metody volání metody průsečíku.
Pokud vás zajímá experimentování s průsečíky, můžete se dozvědět víc o specifikaci 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.