2011-12-29 12 views
8

Ho una domanda per quanto riguarda i seguenti chiamate di metodo:Generico zucchero sintattico o vero miglioramento

var ctl1 = this.FindControlRecursively("SomeField") as HiddenField; 
var ctl = this.FindControlRecursively<HiddenField>("SomeField"); 

Ecco IL per queste due chiamate:

IL_0010: ldstr  "AsyncReset" 
IL_0015: call  class [System.Web]System.Web.UI.Control [Amc.WebG081.MethodExtensions]Amc.WebG081.ControlExtensions::FindControlRecursively(class [System.Web]System.Web.UI.Control,string) 

IL_001a: isinst  [System.Web]System.Web.UI.WebControls.HiddenField 
IL_001f: stloc.0 
IL_0020: ldarg.0 
IL_0021: ldstr  "AsyncReset" 
IL_0026: call  !!0 [Amc.WebG081.MethodExtensions]Amc.WebG081.ControlExtensions::FindControlRecursively<class [System.Web]System.Web.UI.WebControls.HiddenField>(class [System.Web]System.Web.UI.Control,string) 

ho sempre pensato in questa situazione, la la versione generica di questo metodo era più "zucchero sintattico" rispetto al vero miglioramento. IL sta raccontando una storia diversa?

risposta

8

I generici sono incorporati in C#, quindi è un "vero miglioramento". Quindi, perché è possibile la co-varianza e la contro-varianza di runtime, nonché la riflessione su tipi generici e la creazione di tipi generici basati sulla riflessione in fase di esecuzione (come List<T> dove T è determinato in fase di esecuzione).

Questo differisce dal C++, dove i modelli sono, in molti modi, zucchero sintattico. Il compilatore genera effettivamente il codice per ogni tipo generico che usi, quindicreerebbe Add<int>, Add<long>, Add<short>, Add<MyClass> e così via se stai utilizzando queste funzioni e allo stesso modo per le classi. Il vantaggio di questo è principalmente gli operatori e alcune altre piccole cose: se ognuno di questi tipi ha un operatore +, e Add<T>(T a, T b) restituisce un + b, tutti i tipi funzioneranno correttamente. Il compilatore di C# si lamenterebbe perché non può/non risolve la dichiarazione dell'operatore per tutti i tipi in fase di compilazione. Inoltre, C# (non sicuro al 100%, ma forse al 90%) crea 1 implementazione di tipo generico per i tipi di riferimento (se stai usando quell'implementazione) e poi 1 per ogni tipo di valore (così int, long, Decimal, MyStruct, etc all ottenere le proprie implementazioni, se necessario).

Problemi correlati