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# 14 obsahuje následující nové funkce. Tyto funkce můžete vyzkoušet v nejnovější verzi Visual Studio 2026 nebo .NET 10 SDK:
- Rozšiřující členové
- Podmíněné přiřazení s hodnotou Null
-
nameofpodporuje nevázané obecné typy. -
Další implicitní převody pro
Span<T>aReadOnlySpan<T> - Modifikátory jednoduchých parametrů lambda
-
fieldzálohované vlastnosti -
partialudálosti a konstruktory - operátory složeného přiřazení definované uživatelem
- nové direktivy preprocesoru pro aplikace založené na souborech
C# 14 je nejnovější verze jazyka C#. C# 14 je podporován v .NET 10. Další informace najdete v tématu Správa verzí jazyka C#.
Nejnovější sadu .NET SDK 10 si můžete stáhnout ze stránky pro stahování .NET. Můžete si také stáhnout Sadu Visual Studio 2026, která zahrnuje sadu .NET 10 SDK.
Všechny zásadní změny představené v C# 14 najdete v našem článku o zásadních změ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.
Členové rozšíření
C# 14 přidá novou syntaxi pro definování členů rozšíření. Nová syntaxe umožňuje deklarovat vlastnosti rozšíření kromě rozšiřujících metod. Můžete také deklarovat členy rozšíření, které rozšiřují typ, nikoli instanci typu. Jinými slovy, tyto nové členy rozšíření se můžou zobrazit jako statické členy typu, který rozšíříte. Tato rozšíření můžou zahrnovat uživatelem definované operátory implementované jako statické metody rozšíření. Následující příklad kódu ukazuje příklad různých druhů členů rozšíření, které můžete deklarovat:
public static class Enumerable
{
// Extension block
extension<TSource>(IEnumerable<TSource> source) // extension members for IEnumerable<TSource>
{
// Extension property:
public bool IsEmpty => !source.Any();
// Extension method:
public IEnumerable<TSource> Where(Func<TSource, bool> predicate) { ... }
}
// extension block, with a receiver type only
extension<TSource>(IEnumerable<TSource>) // static extension members for IEnumerable<Source>
{
// static extension method:
public static IEnumerable<TSource> Combine(IEnumerable<TSource> first, IEnumerable<TSource> second) { ... }
// static extension property:
public static IEnumerable<TSource> Identity => Enumerable.Empty<TSource>();
// static user defined operator:
public static IEnumerable<TSource> operator + (IEnumerable<TSource> left, IEnumerable<TSource> right) => left.Concat(right);
}
}
Členové v prvním bloku rozšíření se volají, jako by to byli členové IEnumerable<TSource>instance , například sequence.IsEmpty. Členy ve druhém bloku rozšíření se volají, jako by byly statické členy IEnumerable<TSource>, například IEnumerable<int>.Identity.
Další podrobnosti najdete v článku o členech rozšíření v průvodci programováním, referenčním článku jazyka o klíčovém slověextension a specifikaci funkce pro novou funkci členů rozšíření.
Klíčové slovo field
Token field umožňuje psát přístupové tělo vlastnosti bez deklarování explicitního podkladového pole. Token field se nahradí syntetizovaným backingovým polem kompilátoru.
Pokud jste například chtěli zajistit, aby vlastnost string nemohla být nastavena na null, museli jste deklarovat záložní pole a implementovat oba přístupové objekty:
private string _msg;
public string Message
{
get => _msg;
set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}
Kód teď můžete zjednodušit takto:
public string Message
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}
Můžete deklarovat tělo pro jednu nebo obě přístupové metody pro vlastnost realizovanou pomocí pole.
Existuje potenciální změna způsobující problémy nebo nejasnosti při čtení kódu v typech, které také obsahují symbol s názvem field. Pomocí @field nebo this.field můžete lépe rozlišit mezi klíčovým slovem field a identifikátorem, nebo můžete přejmenovat aktuální symbol field, aby bylo možné lépe rozlišovat.
Implicitní převody rozsahu
C# 14 zavádí prvotřídní podporu pro System.Span<T> a System.ReadOnlySpan<T> v jazyce. Tato podpora zahrnuje nové implicitní převody, které umožňují přirozenější programování s těmito typy.
Span<T> a ReadOnlySpan<T> se používají mnoha klíčovými způsoby v jazyce C# a modulu runtime. Jejich zavedení zlepšuje výkon bez rizika bezpečnosti. C# 14 rozpozná vztah a podporuje některé převody mezi ReadOnlySpan<T>, Span<T>a T[]. Typy rozpětí mohou fungovat jako příjemci rozšiřujících metod, skládat se s jinými konverzemi a pomoci s případy odvozování obecného typu.
Seznam implicitních převodů rozsahů najdete v článku o předdefinovaných typech v referenční části jazyka. Další podrobnosti najdete ve specifikaci vlastnosti pro prvotřídní typy rozpětí .
Nevázané obecné typy a nameof
Počínaje jazykem C# 14 může být argument nameof nevázaný obecný typ. Například nameof(List<>) se vyhodnotí jako List. V dřívějších verzích jazyka C# lze k vrácení názvu List<int> použít pouze uzavřené obecné typy, například List.
Jednoduché parametry lambda s modifikátory
Do parametrů výrazu lambda můžete přidat modifikátory parametrů, například scoped, ref, in, outnebo ref readonly do parametrů výrazu lambda, aniž byste zadali typ parametru:
delegate bool TryParse<T>(string text, out T result);
// ...
TryParse<int> parse1 = (text, out result) => Int32.TryParse(text, out result);
Dříve bylo přidání jakýchkoli modifikátorů povoleno pouze v případě, že deklarace parametrů zahrnovaly typy parametrů. Předchozí deklarace by vyžadovala typy pro všechny parametry:
TryParse<int> parse2 = (string text, out int result) => Int32.TryParse(text, out result);
Modifikátor params stále vyžaduje explicitně zadaný seznam parametrů.
Další informace o těchto změnách najdete v článku o výrazech lambda v referenční dokumentaci jazyka C#.
Více částečných členů
Nyní můžete deklarovat instanční konstruktory a instanční události jako částečné členy.
Částečné konstruktory a částečné události musí obsahovat přesně jednu definující deklaraci a jednu implementující deklaraci.
Pouze implementační deklarace částečného konstruktoru může obsahovat inicializátor konstruktoru: this() nebo base(). Pouze jedna částečná deklarace typu může obsahovat syntaxi primárního konstruktoru.
Deklarace částečné události musí zahrnovat add a remove přístupové metody. Definující deklarace deklaruje událost podobnou poli.
Uživatelem definované složené přiřazení
Další informace najdete ve specifikaci funkce pro uživatelem definované složené přiřazení.
Podmíněné přiřazení s hodnotou Null
Operátory podmíněného přístupu členů s hodnotou null, ?. a ?[], lze nyní použít na levé straně přiřazení nebo složeného přiřazení.
Před C# 14 jste museli před přiřazením k vlastnosti zkontrolovat proměnnou s hodnotou null:
if (customer is not null)
{
customer.Order = GetCurrentOrder();
}
Předchozí kód můžete zjednodušit pomocí operátoru ?. :
customer?.Order = GetCurrentOrder();
Pravá strana operátoru = se vyhodnotí pouze v případech, kdy levá strana nemá hodnotu null. Pokud customer je null, kód nevolá GetCurrentOrder.
Kromě přiřazení můžete použít operátory podmíněného přístupu pro hodnotu null spolu se složenými operátory přiřazení (+=, -= a další). Ale přírůstky a dekrementace ++ a --, nejsou povoleny.
Další informace najdete v článku s referenčními informacemi o podmíněném přístupu člena a specifikaci funkce pro podmíněné přiřazení s hodnotou null.