Oggi pomeriggio stavo studiando il comportamento degli Anonymous Types nella speranza di trovare un motivo (anche vagamente) valido per cui utilizzarli ,chiaramente al di fuori di LINQ ;), e volendo analizzare cosa il compiler generasse dietro le quinte in alcuni casi particolari ho provato a eseguire codice come questo...
var var1 = new { UserName = "N1", LastUpdate = DateTime.Now };
var var2 = new { UserName = "N2", LastUpdate = DateTime.Now.ToShortDateString() };
Console.WriteLine(var1.GetType().ToString());
Console.WriteLine(var2.GetType().ToString());
...aspettandomi che il compiler autogenerasse dei tipi dummy diversi tra loro: "in fondo " - pensavo - " la reflection della proprietà LastUpdate dovrebbe portare il compiler a generare due Anonymous Types diversi eh eh eh...". Il risultato che ottengo invece è questo:
<>f__AnonymousType0`2[System.String,System.DateTime]
<>f__AnonymousType0`2[System.String,System.String]
mmmm... stesso Anonymous Type?! Non solo, l'intellisense mi fa vedere per ciascun oggetto (var1 e var2) il corretto tipo associato alla versione della proprietà LastUpdate utilizzata (rispettivamente DateTime e string). Perfetto... mi sta bene...sconfitta bruciante.... ma come è possibile? La risposta è in realtà molto semplice.
Andiamo a disturbare ILDASM:
Si nota immediatamente che le due proprietà UserName e LastUpdate sono definite come Generic (e readonly per essere precisi), quindi riutilizzabili all'interno della stessa classe 'anonima'.... geniale!!!
Ad ogni modo, devo dire che l'utilizzo degli Anonymous Types (da non confondere con il dynamic typing di altri linguaggi come Python e Ruby) non mi entusiasma molto, in quanto non mi piace l'idea che il compilatore scelga e generi nuovi tipi per colmare la pigrizia dello sviluppatore, che secondo me farebbe bene a guardarsi dagli effetti implementativi (spesso deleteri a mio modo di vedere) a cui gli Anonymous Types potrebbero dar vita soprattutto se non si possiede la conoscenza piena di come il compilatore si comporta per supportare questa affascinante quanto inutile feature.
Technorati tags: C#, AnonymousTypes