Miroslav Holec
Premium

Kde můžeme používat C# 9.0

Miroslav Holec   14. prosince 2020

Tento článek je již zastaralý. Článek nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.

V závěru roku 2020 Microsoft vydal aktualizovanou sadu vývojářských nástrojů, která zahrnuje mimo jiné novou verzi runtime, nové verze frameworků, kompileru i samotného jazyka C# 9.0. Podpora jednotlivých verzí jazyka v různých verzích vývojářského stacku se stala součástí mnoha diskusí a netřeba zdůraznit, že drtivá většina příspěvků je silně zavádějících.

Verzování vývojářského stacku

Hledáte-li osvědčené řešení, jak se z verzování produktů Microsoftu nezbláznit, jednoduše se držte vždy kompletního technologického balíčku, který Microsoft vydává. Plán je takový, že by se tak mělo dít vždy na podzim, zhruba v listopadu. Využitím celé sady nově vydaných nástrojů získáte maximální vzájemnou kompatibilitu. Součástí nové sady nástrojů je obvykle i nová verze jazyka C#. Tu by měl vývojář v ideálním případě používat pouze v novém stacku. S vydáním .NET 5 lze tedy využívat veškeré schopnosti jazyka C# 9.0.

Těžký úděl sí-šarpu

Kód, který vývojář napíše v jazyce C# je nutné kompilovat do MSIL assemblies. Těmto assemblies musí rozumět následně runtime. A i když jim runtime rozumí a umí je provést, ještě pořád je zde riziko, že prováděný kód spadne za běhu ve chvíli, kdy bude chtít pracovat s nějakým specifickým typem, který v určité verzi frameworku chybí.

Příkladem potíží s kompatibilitou jsou drobná vylepšení jazyka (například record types v C# 9.0). Použije-li vývojář tuto funkci, musí mít novou verzi kompileru, který dokáže vygenerovat bez potíží IL kód. Provedení samotného IL kódu už ale zvládne provést i starší verze runtime.

Jako vývojář tedy mohu použít C# 9.0 i v .NET Core 3.1 projektech, avšak s řadou omezení. Stejná situace platila i v případě jazyka C# 8.0 a jeho použití v .NET Core 2.1 projektech, potažmo v NET Standard 2.0 knihovnách.

C# 9.0 nabízí mnoho

Dobrá zpráva je, že jazyk C# 9.0 nabízí mnoho funkcionalit, které nevyžadují novou verzi runtime ani dodatečných typů. Jinými slovy si lze C# 9.0 do velké míry vychutnat i v .NET Core 3.1 aplikacích a lze jej při jisté opatrnosti používat i pro vývoj NuGet balíčků targetovaných na NET Standard 2.1. Zde je však nutná obezřetnost, eventuelně dvojí implementace pro různé TFM. Některé funkcionality vývojář k dispozici nemá a musí se bez nich obejít nebo jim zajistit podporu například skrze NuGet balíčky. Příklad mohou být record types, IAsyncEnumerable, IAsyncDisposable a další.

Přestože C# 9.0 si najde své místo i v .NET Core 3.1 projektech, osobně nevidím důvod otálet s relativně jednoduchým přechodem na verzi .NET 5. Kromě nových funkcionalit jazyka lze získat lepší performance a otevřít si cestu k tzv. "nullable rollout phase". Jeremy Likness konkrétně doporučuje: "Pro minimalizaci dopadu změn doporučuji, abychom rok 2021 považovali za zaváděcí fázi, v rámci které budeme přecházet na nullable reference types. Od listopadu 2021 mohou být projekty v novém normálu s nullable reference types jakožto výchozím nastavením".

Podpora .NET 5 prodloužena až do února 2022

V závěru se hodí zmínit, že Microsoft prodloužil podporu pro .NET 5 až do února 2022. Standardní 3 měsíční support tedy upravil pro aktuální .NET 5 tak, že poběží od vydání příští LTS verze (.NET 6). Změna neobsahuje výjimky a měla by se vztahovat i na aplikace napsané v Blazor WebAssembly. Zda se Blazor WASM dočká příští rok LTS zatím stále není zřejmé.