Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
C# 15 obsahuje následující nové funkce. Vyzkoušejte tyto funkce pomocí nejnovější insiders verze Visual Studio 2026 nebo náhledové sady SDK .NET 11:
C# 15 je nejnovější verze C# Preview. Verze .NET 11 Preview podporují C# 15. Další informace najdete v tématu Správa verzí jazyka C#.
Nejnovější sadu .NET 11 Preview SDK si můžete stáhnout ze stránky pro stahování .NET. Můžete si také stáhnout visual studio 2026 insiders, které zahrnuje sadu .NET 11 Preview SDK.
Stránka Co je nového v jazyce C# přidá nové funkce, když jsou dostupné ve verzích Public Preview. Oddíl pracovní sady na stránce stavu funkcionality roslyn sleduje, kdy se nadcházející funkcionality sloučí do hlavní větve.
Všechny zásadní změny představené v C# 15 najdete v našem článku o zásadníchzměnách
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/roslynnový problém.
Argumenty výrazů kolekce
Argumenty můžete předat konstruktoru podkladové kolekce nebo metodě továrny pomocí with(...) elementu jako prvního prvku ve výrazu kolekce. Tato funkce umožňuje zadat kapacitu, porovnávače nebo jiné parametry konstruktoru přímo v syntaxi výrazu kolekce.
Následující příklad ukazuje, jak předat kapacitní argument konstruktoru List<T> a také porovnávače HashSet<T>:
string[] values = ["one", "two", "three"];
// Pass capacity argument to List<T> constructor
List<string> names = [with(capacity: values.Length * 2), .. values];
// Pass comparer argument to HashSet<T> constructor
HashSet<string> set = [with(StringComparer.OrdinalIgnoreCase), "Hello", "HELLO", "hello"];
// set contains only one element because all strings are equal with OrdinalIgnoreCase
Další informace o argumentech výrazů kolekce najdete v referenčním článku jazyka o výrazech kolekce nebo specifikaci funkce. Informace o použití argumentů výrazů kolekce v inicializátorech kolekce naleznete v tématu Objekty a inicializátory kolekce.
Typy sjednocení
C# 15 zavádí typy sjednocení, které představují hodnotu, která může být jedním z několika typů případů. Deklarujte sjednocení s klíčovým slovem union :
public record class Cat(string Name);
public record class Dog(string Name);
public record class Bird(string Name);
public union Pet(Cat, Dog, Bird);
Unióny poskytují implicitní převody z každého typu dat a kompilátor zajišťuje, že výrazy jsou úplné pro všechny typy případů:
Pet pet = new Dog("Rex");
string name = pet switch
{
Dog d => d.Name,
Cat c => c.Name,
Bird b => b.Name,
};
Běhové prostředí zahrnuje typy UnionAttribute a IUnion od verze .NET 11 Preview 5. Některé funkce ze specifikace návrhu ještě nejsou implementovány. Tyto funkce přicházejí v budoucích verzích Preview.
Další informace najdete v referenčních informacích k typům sjednocení jazyka nebo specifikaci funkce.
Uzavřené hierarchie
Počínaje jazykem C# 15 můžete modifikátor použít closed u třídy a deklarovat uzavřenou hierarchii. Z uzavřené třídy lze dědit pouze v rámci sestavení, ve kterém je deklarována, což v době kompilace pevně stanoví množinu přímých odvozených tříd:
public closed record class GateState;
public record class Closed : GateState;
public record class Open(float Percent) : GateState;
Protože kompilátor zná každého přímého potomka, je výraz switch, který zpracovává každý z nich, úplný a nepotřebuje výchozí větev:
string Describe(GateState state) => state switch
{
Closed => "closed",
Open(var percent) => $"{percent}% open",
// No warning: every direct descendant of 'GateState' is handled.
};
closed Modifikátor je kontextové klíčové slovo. Třída closed je implicitně abstract a nelze ji zkombinovat s sealed, static nebo explicitním modifikátorem abstract. Odvození není tranzitivní: nezavřený potomek uzavřené třídy lze stále odvozovat z jiných sestavení. Chcete-li rozšířit kontrolu vyčerpávajícnosti níže v hierarchii, označte také mezilehlé potomky closed.
Poznámka:
V jazyce C# 15 Preview 5 se modul runtime ještě nedoručí System.Runtime.CompilerServices.ClosedAttribute. Dokud to neuskutečí, musí každý projekt, který používá closed modifikátor, deklarovat samotný atribut:
namespace System.Runtime.CompilerServices;
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class ClosedAttribute : Attribute { }
Další informace najdete v vzorech uzavřených modifikátorů a uzavřených hierarchií v odkazu na jazyk nebo specifikaci funkce. Příklady v této části, včetně náhradního řešení ClosedAttribute, můžete zkopírovat z projektu keywords snippets project v repozitáři dotnet/docs na GitHubu.
Bezpečnost paměti
C# 15 zahajuje víceverzovou iniciativu s cílem nově vymezit bezpečnost paměti v jazyce. Cílem je svázat unsafe kontext s operacemi, které ve skutečnosti přistupují k nespravované paměti, nikoli k existenci typů ukazatelů. Většina zranitelností souvisejících s bezpečností paměti pochází z těchto přístupových operací, takže je jazyk zvýrazňuje pro recenzenty a auditory.
V kompletním modelu označuje unsafe na členu tento člen jako requires-unsafe: povinnost auditu přechází na volajícího, který musí člena použít v kontextu unsafe. Sestavení se výslovně podřídí tomuto vynucování a kompilátor tuto volbu zaznamená pomocí atributu System.Runtime.CompilerServices.MemorySafetyRulesAttribute. Model také přidává kontextový klíčový výraz safe, který označuje členy extern a pole s explicitním rozložením jako bezpečné. Tato pravidla společně jasně vymezují hranice potenciálního narušení bezpečnosti paměti v celém programu.
Prvním krokem je odpočinek ukazatele. Při kompilaci s jazykovou preview verzí už následující operace nevyžadují unsafe kontext:
- Deklarování typu ukazatele a převzetí adresy proměnné pomocí operátoru
& - Příkaz
fixed, který připne proměnnou. - Převod výrazu
stackallocna ukazatel - Operátor
sizeofpoužitý na libovolný nespravovaný typ.
Následující příklad vytvoří a připne ukazatel bez unsafe kontextu:
int number = 42;
int* pointer = &number;
int[] numbers = [10, 20, 30];
fixed (int* first = numbers)
{
// Dereferencing the pointer still requires an unsafe context.
}
Operace, které přistupují k paměti, na niž ukazuje ukazatel, jako je dereference ukazatele (*p), přístup ke členu přes ukazatel (p->member), přístup k prvku přes ukazatel (p[i]) a volání funkčního ukazatele, stále vyžadují kontext unsafe.
Model člena requires-unsafe, volitelné přihlášení sestavení k aktualizovaným pravidlům bezpečnosti paměti a kontextové klíčové slovo safe přicházejí v některé z pozdějších verzí Preview.
Další informace naleznete v tématu Nebezpečný kód, typy ukazatelů a ukazatele funkce v odkazu na jazyk nebo specifikaci funkce.