Sdílet prostřednictvím


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 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 structimplicitní 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ří:

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.

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.

Viz také