Ero in cerca di modi per fare l'inizializzazione pigra e trovarono Lazy<T>
che è incluso nel .NET 4.pigri <T> di implementazione e .NET farmaci generici
Stavo pensando a rotazione mia implementazione di Lazy<T>
per NET 3.5 (con una semplice politica di multi-thread), e ho urtato il seguente problema:
pigro ha fondamentalmente due tipi di costruttori:
class Lazy<T> {
public Lazy(){...} // ctor #1
che utilizza costruttore di default di T per la creazione di un n istanza di T e
public Lazy(Func<T> func){...} // ctor #2
che consente al chiamante di decidere come viene creata l'istanza di T.
Ora qui è il problema:
Se voglio in fase di compilazione per il 1 ° ctor vorrei aggiungere una restrizione
class Lazy<T> where T: new() {...}
a livello di classe. Questo mi permetterà di usare new T()
per creare un'istanza; ma questa restrizione non è necessaria per il 2 ° ctor e, peggio, limita anche i tipi che posso usare (a quelli con un ctor predefinito)
Se voglio essere in grado di utilizzare qualsiasi tipo con il 2 ° ctor, io non imposterà alcuna restrizione e nel 1 ° ctor userà il reflection per assicurarsi che T
abbia un ctor predefinito. Questo approccio, tuttavia, mancherà del controllo in fase di compilazione e genererà un'eccezione di runtime solo se il primo ctor viene utilizzato con il tipo sbagliato.
La mia domanda è: posso ottenere il meglio da entrambi i mondi?
Idealmente, vorrei ottenere il controllo in fase di compilazione per ogni utilizzo di Ctor # 1, ma allo stesso tempo essere in grado di utilizzare il codeC# 2 per i tipi che non hanno un Ctor predefinito.
Come funziona l'implementazione Microsoft? (Non ho prontamente accesso a .NET 4 fonti o DLL).
EDIT: (dopo "Reflector-ing" l'assemblea MS)
ho controllato l'implementazione di riferimento e non fa a tempo di compilazione controlli.
Usa la riflessione per il caso 'default ctor', ovviamente accompagnato dall'eccezione di runtime se le cose vanno male.
È possibile utilizzare Reflector per osservare l'implementazione .NET 4 –
@Thomas mi piace citando me stesso. Mi sembra importante: "Non ho prontamente accesso a .NET 4 fonti o DLL" ... o almeno questo era vero quando ho posto la domanda. Nel frattempo, grazie al suggerimento di Lucas, ho ottenuto una sospensione delle assemblee e ho aggiornato la domanda con le mie conclusioni. –
OK, ho perso la parte "o dll" ... scusa –