Kaip žinia, praeitą savaitę per PDC buvo anonsuotas C# 4.0. Aš turėjau progą su juo pažaisti truputi anksčiau, bet niekaip negalėjau prisėsti ir parašyti kelių straipsnių ciklą skirtą naujoms C# galimybėms aptarti. Pagaliau atsirado tokia galimybė. Šioje dalyje aš noriu trumpai aptarti C# kalbos evoliuciją ir aptarti naujas dinamines C# 4.0 galimybes.




Kadangi pirmoji C# versija atsirado kartu su .NET Framework, tai pagrindinis kalbos akcentas buvo valdomas kodas.




Antroje C# versijoje atsirado daug naudingų dalykų, iš kurių ryškiausias  - bendrybės. Nuo šios versijos visos kolekcijos pasidarė tipizuotos, o klasės galėjo būti unifikuotos.




C# 3.0 vienareikšmiškai siejamas su deklaratyviu programavimu ir gerai žinoma LINQ technologija: LINQ-to-Objects, LINQ-to-SQL, LINQ-to-XML, … Su LINQ siejamas ir Lambda išraiškų pasirodymas.




Pagaliau ketvirtoji C# versija, kuri nėra mano manymu tokia revoliucinė kaip trečioji, bet kuri yra kertinė nusakant kalbos ateitį. Pagrindinis C# 4.0 fokusas – dinaminės kalbos galimybės. Kaip žinia, prieš kurį laiką virš CLR (Common Language Runtime) buvo sukurta taip vadinama DLR aplinka (Dynamic Language Runtime). Kartu su ja atsirado tokios .NET dinaminės kalbos kaip IronPython, IronRuby, Managed JavaScript. C# ir Visual Basic tradiciškai buvo statinės kalbos ir priklausė CLR aplinkai, naujos šių kalbų versijos jau gali būti iš dalies priskirtos prie DLR aplinkos:



Kitais žodžiais, C# 4.0 galima statiškai nusakyti, kad objektas yra dinaminis. Žemiau pateiksiu keletą paprasčiausių pavyzdžių:



Kaip matyti, atsirado naujas C# raktažodis – dynamic. Jo pagalba mes nusakome kompiliatoriui, kad kintamojo tipas turi būti nustatomas vykdymo metu, o ne kompiliavimo. Tiksliau sakant, vykdymo metu dinaminis tipas yra keičiamas konkrečiu ir tuo galima įsitikinti vykdant aukščiau pateiktą kodą:



Dėl šios priežasties, ne tik kintamasis gali būti dinaminiu, bet ir metodas gali priimti dinaminius argumentus bei grąžinti dinaminį objektą. Panašiai, dinaminis objektas gali būti perduotas kaip argumentas į paprastą metodą. Pavyzdžiui, gerai žinomas Console.WriteLine metodas turi 18 perkrovų, o perdavus į jį dinaminį objektą, kokia konkreti perkrova bus naudojama paaiškės tik vykdymo metu.



Šiuo atveju, kadangi dinaminis tipas vykdymo metu bus pakeistas į Int32, tai bus panaudota aštuntoji Console.WriteLine metodo perkrova.




Dar viena įdomi savybė – galimybė įprastam objektui priskirti dinaminį objektą. Tai įmanoma tik tuo atveju, jeigu realus dinaminio objekto tipas sutampa su statiniu tipu arba konvertavimo taisyklės yra aprašytos pačiame dinaminiame objekte:



Didžiausias dinaminių kalbų trūkumas: IntelliSense nebuvimas ir prasta greitaveika. Praktikoje dinaminės kalbos yra daug lėtesnės negu statinės. Kodėl tokios galimybės atsirado C#? Tai pabandysiu paaiškinti kitoje dalyje…

Rodyk draugams