Miroslav Holec
Premium

Novinky v C# a kejkle s Roslynem

Miroslav Holec   23. ledna 2015  update 29. března 2016

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 tomto článku se pokusím velmi stručně naznačit, jaké zásadní novinky přináší nová verze jazyka C# 6.0. Také se zmíním o novém compileru Roslyn a připíšu některé tipy s ním související. Zároveň zde uvedu nejcennější zdroje informací, které se všemi novinkami souvisí.

Nechť je tento článek souhrnným rozcestníkem a také doplňujícím materiálem k přednášce Novinky v C# 6.0 a kejkle s Roslynem, která se poprvé uskuteční v Hradci Králové, dne 28. ledna 2015 na FIM. Chcete-li přijít na tuto akci, naplánujte si účast pomocí Facebook Events (nezávazné potvrzení, jen pro lepší organizaci akce).

Z historie

Historie jazyka C# je velmi úzce spojena s .NET frameworkem a sahá až do roku 1997. Skutečná první verze byla vydána společně s .NET frameworkem a pro veřejnost uvolněna 15. ledna 2002. Od té doby se toho odehrálo ve světě .NETu a C# skutečně mnoho.

Novinky v jazyce C#

Dovolím si doporučit některé zajímavé články, jeden z nich napsal James Kovacs a zaměřuje se na samotnou cestu ke vzniku C#, druhý článek od Pavla Černohorského pojednává o souvislostech mezi programovacími jazyky C, C++ a C#.

Roslyn

Jak uvádí Microsoft, černou skřínkou je kompiler, do kterého se z jedné strany sype zdrojový kód a na základě jeho implementace vznikají na výstupu assemblies. Magie uvnitř compileru byla ale poslední dobou pro vývojářský tým Microsoftu dost namáhavá. Starý compiler napsaný v jazyce C++ byl na prahu svých možností a přidání jakékoliv další funkce už představovalo problém. Nejen proto, ale i vzhledem k filosofii, kterou Microsoft nyní prosazuje vznikl nový compiler Roslyn, napsaný v jazyce C# a Visual Basic. Protože je compiler používán vývojářem během práce prakticky neustále (například pro IntelliSense aj. funkce IDE), je nanejvýše důležitá jeho rychlost. Příchod Roslynu tak pocítíme na svižnosti nové verze Visual Studia 2015, která přináší mj. s tím související features pro analýzu kódu nebo refaktoring.

Roslyn kompilace

Compiler si může každý vývojář stáhnout a podle libosti jej rozšiřovat. Stáhnout lze přímo zdrojový kód nebo nuget balíček. Balíček je v pre-release verzi ale už nyní mu dal tým Microsoftu při vší úctě idiotský název, který do roka stejně změní:

Install-Package Microsoft.CodeAnalysis.CSharp -Pre

Je tedy bez problému možné vytvořit .cs soubor v jakémkoliv editoru (např.: notepad) a ten následně zkompilovat. Jsou tři obecné cesty.

  • provést kompilaci ve Visual Studiu 2015 (standardní řešení)
  • provést kompilaci přímo s použitím kompileru csc.exe
  • provést kompilaci za běhu s použitím Roslyna (např.: jako NuGet balíčku)

První možnost nemá smysl rozepisovat, proto zkusme rovnou tu druhou.

Kompilace C# kódu pomocí cmd a csc.exe

Vezměme tento kód:

using System;

namespace Example
{
    class Program
    {
		public string SomeVariable { get; set; } = "Value"; 

        static void Main()
        {
			Console.Write("Everything works");
			Console.ReadLine();
		}
	}
}

Pokud bychom jej chtěli zkompilovat, stačí vytvořit soubor hello.cs, spustit cmd.exe a tento soubor následně zkompilovat pomocí příkazu:

csc hello.cs

Pro spuštění je potřeba se nascopovat ke kompileru do cesty

c:\{PROGRAM_FILES}\MSBuild\{VS_VERSION}\Bin

Pro Visual Studio 2015 aktuálně

c:\Program Files (x86)\MSBuild\14.0\Bin

Výstupem příkazu bude spustitelný soubor hello.exe. Demo kód již obsahuje jednu novou funkci jazyka C# 6.0 - auto-property initializer. Stejný kód samozřejmě nepůjde zkompilovat ve Visual Studiu 2013, jelikož používá původní verzi kompileru, který nalezneme v MSBuild\12.0\Bin a který nové features jazyka C# 6.0 nepodporuje.

Kompilace za běhu

Další možností je vytvořit si testovací projekt ve Visual Studiu, stáhnout NuGet balíček Microsoft.CodeAnalysis.CSharp a poté napsat pár řádků kódu, který pomocí Roslynu kód zkompiluje. Výhodou samozřejmě je, že toto celé se dá provést ve Visual Studiu 2013. Kód může vypadat v případě konzolové aplikace například takto:

string code = File.ReadAllText("d:/hello.cs");
SyntaxTree tree = SyntaxFactory.ParseSyntaxTree(code);

CSharpCompilation compilation = CSharpCompilation.Create("hello")
    .AddReferences(MetadataReference.CreateFromAssembly(Assembly.GetAssembly(typeof(Int32))))
    .AddSyntaxTrees(tree);

EmitResult result = compilation.Emit("hello.exe");

Žádná magie v tom není, kód je celkem intuitivní a asi nepotřebuje ani komentář. Metoda AddReferences je nezbytně nutná, protože referencuje Assembly System, která je dohledána přes typ Int32. Výstupem je opět spustitelný soubor hello.exe. Pro vyzkoušení nových features jazyka C# 6.0 tedy není potřeba nové Visual Studio, bohatě stačí vytvořit konzolovou aplikaci a nastavit si kompilaci pomocí Roslyna. Proměnná result obsahuje informace o výsledku komplikace včetně diagnostiky.

Visual Studio 2015

Compiler vývojář doposud příliš nemusel řešit a nebude tomu jinak ani v budoucnu. Spolu s instalací Visual Studia se instaluje i samotný compiler do zmíněných složek. Konkrétně Roslyn se instaluje společně s Visual Studiem 2015, které je momentálně v preview verzi. Oficiální datum vydání finální verze není v době psaní článku známo ale lze předpokládat (možná jsem si to jen vsugeroval), že by to mohlo být na konci dubna.

Co nového umí C# 6.0

Každá doposud vydaná verze jazyka C# přišla s určitou převratností. První verze přinesla generické třídy, druhá pak lambda výrazy, anonymní metody a statické třídy s extension metodami. Zajímavá byla i třetí verze jazyka díky anonymním typům nebo C# 4.0 s podporou dynamic / DLR. Poslední verzi C# 5.0 máme asi všichni spojenou s async & await.

Šestá verze s žádnou převratnou novinkou nepřichází. Samotný jazyk C# přináší víceméně jen syntaktická vylepšení, která by měla vývojáři usnadnit život. Na druhou stranu je těchto vylepšení celá řada a některá z nich jsou velmi praktická. Z těch zajímavých uveďme:

  • auto property initializers
  • geter-only auto-properties
  • constructor assignment to getter-only autoprops
  • parameterless struct ctors
  • using static members
  • dictionary initializer
  • await in catch/finally
  • exception filters
  • null propagation
  • string interpolation
  • nameof operator

O novinkách podrobně vč. ukázek

Demo ke stažení

Níže je možné stáhnout si demo konzolové aplikace, na které jsou předvedeny ty nejpodstatnější novinky v C# 6.0. Demo je spustitelné i ve starších verzích Visual Studia, jelikož používá Roslyn jako nuget package a příklady kompiluje za běhu.

Demo aplikace ke stažení