Recientemente noté que los tipos construidos genéricos pueden abrirse y cerrarse. Pero no entiendo lo que realmente significan. ¿Puedes dar un ejemplo simple?Genéricos: construcción abierta y cerrada Tipos
Respuesta
En la práctica la terminología realmente no importa mucho - No puedo recordar la última vez que tuve que preocuparme salvo cuando intenta escribir sobre él.
- Un no unido tipo no tiene argumentos tipo especificado
- Un tipo construido ha al menos un tipo argumento especificado
- un parámetro de tipo es un tipo abierto
- un tipo de matriz donde el tipo de elemento está abierto es tipo abierto
- Un abierto tipo construido tiene al menos un argumento tipo que es un tipo abierto
- A cerrado tipo es cualquier tipo que no está abierto
(Hay otras reglas para tipos anidados. . Consultar la sección spec C# 3.0 4.4 para detalles morbosos)
Como un ejemplo de un tipo construido abierto, considere:
public class NameDictionary<T> : Dictionary<string, T>
La clase base de typeof(NameDictionary<>)
es:
- Construido porque especifica los argumentos de tipo
- Abierto porque el segundo argumento de tipo (
T
) es un tipo abierto
Los documentos de MSDN para Type.IsGenericType
tienen una tabla bastante útil.
Solo para reiterar, esto es casi completamente sin importancia en el uso diario.
Estoy generalmente a favor de conocer la terminología correcta, en particular para cosas como "pasar por referencia", etc., pero en este caso realmente, realmente no aparece muy a menudo. Me gustaría desanimarlo activamente para que no se preocupe :)
De MSDN:
un tipo genérico o método se cierra si tipos instanciables han sido sustituidos para todos sus parámetros de tipo, incluyendo todos los parámetros de tipo de todo tipo de cerramiento. Solo puede crear una instancia de un tipo genérico si está cerrado.
Así que esto funciona como List<int>
es cerrado:
var list = Activator.CreateInstance(typeof(List<int>));
Pero esto produce una excepción en tiempo de ejecución debido a List<>
es abierta:
var list = Activator.CreateInstance(typeof(List<>));
↑
En ese caso también es un tipo desatado - un tipo abierto, construido es el tipo más esotérico :) –
He usado sobre todo genéricos abiertos (genéricos básicamente desinstalados) en mapeos de inyección de dependencia. Por ejemplo, algo así como
Bind<IRepository<>>()
.To<BasicRepository<>>()
Entonces, cuando mi constructor de objeto contiene:
public SomethingController(IRepository<Something>) { ... }
Mi mecanismo de inyección de dependencia será una instancia de un BasicRepository < Algo> automágicamente. (Esto funciona con Ninject y StructureMap, y probablemente con la biblioteca Castle Windsor; no estoy seguro de otros frameworks).
'Autofac' también admite tipos genéricos abiertos: [Autofac - crear componentes] (https://code.google.com/p/ autofac/wiki/ComponentCreation # Open_Generic_Types) – sgnsajgon
Al igual que [SimpleInjector] (http://simpleinjector.readthedocs.org/en/latest/advanced.html#registration-of-open-generic-types) –
- 1. . Terminología de genéricos .NET - abierta/cerrada, sin consolidar/construida
- 2. Tipos de unión abierta y cerrada en Ocaml
- 3. tipos anónimos y genéricos
- 4. Reflexión y tipos genéricos
- 5. tipos primas y Genéricos - Java
- 6. polimorfismo, genéricos y tipos anónimos C#
- 7. Genéricos de Java y tipos de devolución
- 8. colección de tipos genéricos
- 9. C# tipos genéricos
- 10. Marshalling .NET tipos genéricos
- 11. Colección de tipos genéricos
- 12. Tipos genéricos opcionales
- 13. Tipos genéricos recursivos
- 14. ¿Cómo comparar tipos genéricos?
- 15. GetType en tipos genéricos
- 16. Comprobar conexión abierta o cerrada? (En C en Linux)
- 17. limitantes tipos genéricos en C#
- 18. C# polimorfismo en tipos genéricos
- 19. Filtrando listas de tipos genéricos
- 20. tipos C# genéricos causa ambigüedad
- 21. ¿Cómo restringir varios tipos genéricos?
- 22. error de javac: tipos inconvertibles con genéricos?
- 23. genéricos C# - posible crear un método con n tipos genéricos ..?
- 24. Java tipos genéricos y de matriz, no es lo que está pensando (por ejemplo, matrices de tipos genéricos)
- 25. EventArgs genéricos para los tipos incorporados
- 26. Autocompletar para tipos genéricos en Eclipse
- 27. operador implícito sobre los tipos genéricos
- 28. java6, guayaba, genéricos, la inferencia de tipos
- 29. Funciones con los tipos de parámetros genéricos
- 30. ¿Puedo crear un diccionario de tipos genéricos?
Ahora un día la mayoría de las preguntas de la entrevista que enfrenté se preguntan desde su libro. Por lo tanto, para fines de aclaración, pregunté. :). – user196546
@generixs: Si alguien me preguntara en una entrevista, confesaría que no podría decir sin consultar un libro o las especificaciones :) No es una pregunta de entrevista muy útil, tengo que decir. –
:) dame una parte de tu cerebro, para que pueda responder como si fuera un Jon Skeet .. (lo siento por broma ...). – user196546