VS2010 en .NET 4.0 – Dynamic

Variabelen moet je in .NET altijd netjes typeren.

orgdeclaraties

En ook als het datatype niet in de variablenaam staat (zoals sommige codeerstandaarden voorschrijven), dan weet je het datatype door de ondersteuning van Visual Studio. Niets aan de hand, voor iedereen duidelijk en overzichtelijk.

compilerhint

Maar sinds versie 3.0 is er een manier bijgekomen. Het keyword VAR werd geintroduceerd (niet te verwarren Variant in VB). Deze declaratie wijze wordt veel gebruikt bij Linq queries. Maar ook in andere situaties prima bruikbaar. Nog niets aan de hand. Je declareert een variabele van het type var en je moet hem gelijk initialiseren. Vervolgens doet de compiler net alsof je wel een datatype opgegeven hebt.

compilerhintvar

Wat er gebeurt, het werkelijke datatype wordt afgeleid van de initialisatie en kan dan natuurlijk niet meer wijzigen. Bij het compileren wordt deze optimalisatie doorgevoerd. Er gebeurt dus niet op runtime.

Zie deze foutmelding:

compvarstrint

Met versie 4.0 komt er een derde variant bij, namelijk het keyword Dynamic. Deze zal runtime bepalen van welk type een variabele is en daar naar acteren. Heel handig is situaties waarin je geen Code completion tot je beschikking hebt, zoals het gebruik van COM objecten. Als je, zoals in onderstaand voorbeeld een variabele declareert van het type dynamic, dan zal de compiler (bij de declaratie van een Class) aangeven het werkelijke type at runtime te resolven. Bij een simpele variabele zoals hierboven zal rode krinkeltje verdwijnen.

 compilerhintdynamic

Wat is het grootste verschil tussen de drie manieren dan? Performance is een verschil, het resolven van een Dynamic op runtime kost uiteraard tijd.

Zie hier mij voorbeeld. Ik heb een MyClass met 2 methoden.

 class

Ik heb een methode, die de drie varianten gebruikt en ik bereken het verstreken milliseconden. Als de twee regels met commentaar slashes zouden voor compiler errors zorgen.

 declaraties2

Het resultaat is dan, zoals verwacht. Het gebruik van het dynamic variant kost tijd.

 elapsedms

Ik ben benieuwd, hoe vaak dit keyword misbruikt gaat worden.

This entry was posted in .NET, SDN, VS2010 by Marcel Meijer. Bookmark the permalink.

About Marcel Meijer

Op dit moment houdt hij zich voornamelijk bezig met Microsoft Azure, Cloud, C#, Software Ontwikkeling, Architectuur, etc. Hij werkt als consultant voor zijn eigen bedrijf JOEP-IT bv. In zijn vrije tijd is hij voorzitter, bestuurslid, eindredacteur en eventorganisator bij de SDN (Software Development Network). Sinds 1 oktober 2010 is hij MVP.

Leave a Reply

Your email address will not be published. Required fields are marked *