yo estaba buscando maneras de hacer la inicialización perezosa y encontraron Lazy<T>
que se incluye en .NET 4.Lazy <T> de implementación y .NET genéricos
Estaba pensando en rodar mi propia implementación de Lazy<T>
para .NET 3.5 (con una política multi-hilo sencillo), y me encontré con el siguiente problema:
Lazy tiene básicamente dos tipos de constructores:
class Lazy<T> {
public Lazy(){...} // ctor #1
que utiliza constructor por defecto de T como la creación de una n ejemplo de T, y
public Lazy(Func<T> func){...} // ctor #2
que le permite a la persona que llama decidir cómo se crea la instancia de T.
Ahora aquí está el problema:
Si quiero en tiempo de compilación para la primera comprobación de Héctor voy a añadir una restricción
class Lazy<T> where T: new() {...}
a nivel de clase. Esto me permitirá usar new T()
para crear una instancia; pero esta restricción no es necesaria para el segundo ctor y, lo que es peor, también restringe los tipos que puedo usar (para aquellos con un ctor predeterminado)
Si deseo poder usar cualquier tipo con el 2do ctor, no establecerá ninguna restricción, y en el 1er ctor utilizará la reflexión para asegurarse de que T
tenga un ctor predeterminado. Sin embargo, este enfoque carecerá de la verificación en tiempo de compilación, y solo lanzará una excepción de tiempo de ejecución si el primer ctor se utiliza con el tipo incorrecto.
Mi pregunta es: ¿Puedo obtener lo mejor de ambos mundos?
Idealmente, me gustaría obtener la verificación en tiempo de compilación para cada uso de ctor # 1, pero al mismo tiempo poder usar ctor # 2 para los tipos que no tienen un ctor predeterminado.
¿Cómo lo hace la implementación de Microsoft? (No tengo acceso a las fuentes .NET 4 o dlls).
EDIT: (Después de "reflector-ing" la asamblea MS)
he comprobado la implementación de referencia y no lo hace en tiempo de compilación cheques.
Utiliza la reflexión para el caso de "ctor predeterminado", por supuesto, acompañado por la excepción de tiempo de ejecución si las cosas van mal.
Puede utilizar el reflector para mirar el .NET 4 aplicación –
@Thomas me gusta citando a mí mismo. Me hace sonar importante: "No tengo acceso fácilmente a las fuentes .NET 4 o dlls" ... o al menos eso era cierto cuando hice la pregunta. Mientras tanto, gracias a la sugerencia de Lucas, obtuve las asambleas y actualicé la pregunta con mis hallazgos. –
OK, me perdí la parte "o dlls" ... lo siento –