DLR nova komponenta .NET frameworka
U prethodna dva dijela obradili smo neke novine koje dolaze sa novom verzijom C# 4.0, gdje smo se upoznali sa opcionim i imenskim parametrima, kao i ko i kontra varijncama novim svojstvima programskog jezika. U ovom postu govori ćemo o novom svojstvu C# odnosno dinamičkim tipovima podataka u jeziku. Novom verzijom kompletnog .NET 4.0 frameworka microsoft uvodi novu tehnologiju poznatu pod imenom DLR – Dynamic Language Runtime.
DLR implementirana je nad CLR (Common Language Runtime) i nadopunjava je sa skupom tehnologija i alata pomoću kojih se može izvršavati interne operacije u .NET frameworku, te u vrijeme izvršavanja koda pretvarati dinamicke tipove u statičke.
Podrška za DLR u .NET 4.0 sadrži novi prostor imena System.Dynamic. DLR sadrži 3 sloja prikazana na gornjoj slici i to:
- The .NET Language Integration Layer – (Integracijski sloj za .NET jezke)
- The Dynamic Language Runtime Code Components – (Komponente coda DLR)
- Language Binders – (Jezički povezivač)
DLR service sadrži:
- Dynamic Method Dispatch – Prosljeđivač dinamičkih metoda
- Dynamic Code Generation – Generator Dynamičkog koda
- Hosting API – API za hostovanje [preuzeto sa 1]
Statički dinamički tipovi
Novom verzijom C# 4.0 kao i novom proširenju .NET frameworka DLR obezbjeđuje se mogućnost implementacije dinamičkih tipova podataka u C#. Kao što je poznato C# do sada je definisao statički određene tipove podataka. To jednostavno znači da u vrijeme kompajliranja koda poznati su svi tipovi podataka koji se nalaze. Svaka situacija u kojoj kompajler ne može izvršiti konverziju jednog tipa u drugi ili jednostavno deklarisani tip ne poznaje, pojavljivala se greška kompajlera.
Sa dynamic novom ključnom riječju u C#4.0 deklariše se dinamički tip podataka. Ovo znači da ovako deklarisani tip podata je nepoznat u vrijeme kompajliranja, te kompajler neće javiti nikakvu grešku. U vrijeme izvršavanja koda DLR obezbjeđuje da se ovaj dynamički tip deklariše i potpuno definiše u statički. Više informacija o statičkim odnosno dinamičkim tipovima podataka kao i načinu korištenja te tretiranja kompajlera možete naći na stranici wikipedie [2]. Nrp pogledajmo sljedeći dio koda:[primjer preuzet sa 3]
<pre>class Program { static void Main(string[] args) { foreach (dynamic d in GetValues()) Console.WriteLine("{0} ima {1} godina.", d.Ime, d.Godina); } static IEnumerable<dynamic> GetValues() { Dictionary<string, int> result = new Dictionary<string, int>(); result["Šemso"] = 30; result["Elvis"] = 25; foreach (var item in result) yield return new { Ime = item.Key, Godina = item.Value }; } }
Ovakvu konstrukciju koda nismo mogli implementirati u prethodnim verzijama C# je se anonimne klase nisu mogle globalno prenositi, odnosno var ključna riječ mogla se samo lokalno upotrbljavati. Sada kada imamo dynamic ključnu riječ ovakvu konstrukciju odnosno anonimnu klasu možemo imati kao tip podataka koju vraća neka metoda. Na koji nači kompajler tretira ovaj kod. Naime u vrijeme kompajliranja anonimna klasa dobije svoju definicu koja u vrijeme izvršavanja posjeduje statički tip. DLR u vrijeme izvršavanja koda definisani tip koji je kompajler odredio anonimnoj klasu obezbjeđuje vraćanje podataka kroz foreach petlju.
Dinamički tipovi nisu TypeSafe to znači da ako u implementaciji foreach petlje napišemo npr.
<pre>foreach (dynamic d in GetValues()) Console.WriteLine("{0} ima {1} godina.", d.Naziv, d.Godiste);
Kompajler neće pronaći ni upozoriti na bilo kakvu grešku ili upozorenje, a naš program će prilikom pokretanja izbaciti izuzetak da nešto ne štima sa članovima anonimne klase.
Razlika između var i dynamic
Primjetićemo da i u C# 3.0 postoji var ključna riječ koja ima istu funkciju kao dynamic, što je totalno pogrešno. var ključna riječ spoznaje svoj istinski tip podatke u vrijeme kompajliranja. U to se možemo uvjeriti ako na definisani var tip odnesemo miša a intellisence vam već daje informaciju o kojem tipu se podatka radi. To znači da var tip u vrijeme kompajliranja definiše svoj istinski tip podatka, što kod dynamicto nije slučaj.
Reference: