2010-09-18 10 views

Respuesta

18

No, no se incluirá en la caja. En el momento de la ejecución, la matriz de respaldo para el List<int> será genuinamente un int[]. Tenga en cuenta que este no es el único caso con tipos primitivos genuinos: List<T> no encapsulará valores de ningún tipo de valor (suponiendo que se haya declarado como List<Guid>, etc. en lugar de List<object>).

Básicamente, los genéricos en .NET conservan mucha más información de la que tienen en Java: CLR entiende nativamente los genéricos y los trata de forma adecuada, en lugar de Java, donde la JVM los desconoce.

Por ejemplo, si escribe:

object list = new List<string>(); 
Type type = list.GetType(); 

Entonces type será igual a - que es diferente a continuación (por ejemplo) List<Guid> etc.

3

. Los genéricos .NET se están especializando para las estructuras, por lo tanto no se requiere boxeo en su caso. Tenga en cuenta que no hay necesidad de lanzar de todos modos.

5

Los valores int no será encajonado dentro de la lista. Esta es una de las bellezas con genéricos, que el compilador (más específicamente el compilador JIT, creo) construirá una versión mecanografiada de la clase List<>, en lugar de almacenar los valores como object. Por lo tanto, no solo hace cumplir la seguridad de tipo a través de los métodos y propiedades expuestas, sino que se tipea genuinamente en todos los aspectos.

5

Como han notado otros, el jitter genera un nuevo código para cada construcción que involucre un nuevo tipo de valor. Un punto interesante aún no mencionado hasta ahora es que el jitter generará el código una vez para un tipo de referencia construcción y reutilización que para cada tipo de referencia. El código para List<object> es exactamente el mismo que el código para List<string>.

Puede parecer una locura, pero recuerde, los genéricos no son plantillas. En el momento en que se emite el código para el cuerpo genérico del cuerpo IL, la resolución de sobrecarga y otro análisis semántico relevante ya es hecho por el compilador C#.

+0

Sin embargo, una llamada a, digamos, 'new T [10]' seguirá creando el tipo correcto de matriz, incluso para los tipos de referencia. –

Cuestiones relacionadas