Il Dynamic Language Runtime è una delle novità maggiori del nuovo .NET Framework 4.0. Il DLR è un nuovo ambiente di runtime che arricchisce il Common Language Runtime esistente di nuove funzionalità mirate al supporto dei linguaggi dinamici quali Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, etc.
Oltre a questo, sono state anche aggiunte funzionalità dinamiche ai già presenti linguaggi statici del Framework (C# e VB.NET). àˆ stato infatti aggiunto un nuovo namespace, System.Dynamic, in cui sono presenti nuovi tipi che consentono la gestione di codice dinamico. Una delle possibilità più interessanti è quella di creare in C# una variabile di tipo dynamic in maniera molto simile (ma non uguale) a quanto si poteva già fare in VB con la keyword Dim.
Questa nuova parola chiave indica che l'oggetto creato non ha un tipo predefinito in quanto può essere valutato e cambiato a runtime (processo chiamato Late Binding). L'utilità della keyword dynamic è evidente ogni qual volta abbiamo a che fare con oggetti COM, con oggetti di linguaggi dinamici come IronPython, con il Document Object Model (DOM) dell'HTML oppure con assembly caricati tramite reflection. In tutti questi casi in passato eravamo costretti a scrivere codice poco leggibile e complicato per poter accedere a proprietà e metodi di questi oggetti perchè di essi non abbiamo le meta informazioni necessarie che ci forniscano la struttura degli stessi. Ora con la nuova keyword dynamic tutto cià diventa semplice e quasi banale.
Ecco degli esempi di dichiarazioni dynamic:
dynamic myObj = "questa è una stringa"; // qui myObj è una stringa myObj = true; // qui diventa un boolean myObj = 15; // qui diventa un intero
Ma la vera utilità dei tipi dynamic si ha quando abbiamo a che fare con classi custom provenienti da "ambienti dinamici" come detto poc'anzi. Immaginiamo quindi di avere per esempio una classe così formata:
class MyClass { public MyClass() { } public string GetValue(int i) { } public string GetValue(string s) { } }
Normalmente il seguente codice darebbe errore in fase di compilazione:
MyClass myC = new MyClass(); myC.GetValue();
Il motivo è che il controllo statico sul tipo (static type checking) si accorge che la classe non contiene alcun overload del metodo GetValue che non accetta alcun parametro e quindi solleva una eccezione in fase di compilazione. Se invece dichiarassimo lo stesso oggetto con la keyword dynamic le cose andrebbero diversamente:
dynamic myC = new MyClass(); myC.GetValue();
In questo secondo caso, non avremmo alcun errore di compilazione in quanto il controllo statico sul tipo non avviene. Ovviamente in questo esempio abbiamo utilizzato una classe creata da noi stessi e quindi l'utilità è limitata mentre nel caso in cui ci trovassimo dinanzi ad oggetti COM o come detto precedentemente oggetti provenienti da ambienti dinamici come JavaScript o il DOM di una pagina HTML, allora l'utilità della keyword dynamic diventerebbe evidente.