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.

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ů. structImplicitní 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 classrecord 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ří:

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:

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.

Viz také