2008-12-11 18 views
27

Estoy tratando de construir mi primera lista genérica y me he encontrado con algunos problemas. Entiendo que la declaración parece "List<T>", y tengo using System.Collections.Generic; en la parte superior de mi página. Sin embargo, Visual Studio no reconoce la variable T.¿Qué son las colecciones genéricas en C#?

¿Qué me estoy perdiendo?

+1

No se sienta mal, pasé por exactamente lo mismo cuando comencé a aprender .NET 2.0. Me preguntaba, "¿Qué diablos significa T, y por qué Visual Studio no sabe lo que estoy tratando de hacer?" –

+0

Entonces, si quiero tener diferentes tipos de objetos en mi lista, necesito usar una interfaz, es decir, la lista , así que almacene catObj, y dogObj, por ejemplo? –

+1

La lista debería funcionar. – Jimmy

Respuesta

43

List<T> significa List<WhateverTypeYouWantItToBeAListOf>. Así, por ejemplo:

Si tengo una clase de empleados, y quería una colección de empleados, podría decir:

List<Employee> employeeList = new List<Employee>(); 

pude luego añadir Employee objetos a esa lista, y tiene que ser Tipo- seguro y se extienden a tantos objetos de empleado que pongo en él.

así:

Employee emp1 = new Employee(); 
Employee emp2 = new Employee(); 

employeeList.Add(emp1); 
employeeList.Add(emp2); 

employeeList ahora sostiene emp1 y emp2 como objetos.

Hay varias facetas en las colecciones genéricas, las más importantes son que proporcionan una forma independiente de objeto de tener una ... colección de objetos. Son seguros para el tipo de letra; lo que significa que cualquier colección consistirá en un tipo de objeto. Usted no tiene una instancia Animal interior de List<Employee> (a menos que, por supuesto, de los empleados es una clase base que hereda de Animal. En ese momento, sin embargo, tienen problemas mayores.

Programación con los genéricos es su propio tema, digno de (al menos) un capítulo en un libro. En un nivel muy alto, la programación con genéricos proporciona otra forma de reutilizar código, independientemente de cualquier jerarquía de clase o detalles de implementación de una clase específica.

Más información here.

2

¿Está tratando de usar la clase List o está tratando de construir la suya propia? ¿Cómo se ve tu código en este momento?

7

Por ejemplo, si desea una lista genérica de números enteros (int) que iba a escribir:

List<int> list = new List<int>(); 

T es un parámetro de tipo, que en su código debe ser un tipo real.

10

Usted necesidad de sustituir T de otro tipo, tales como int, string o una clase de su creación:

List<int> values = new List<int>(); 

values.Add(1); 
values.Add(2); 

int secondNumber = values[1]; // Yay! No casting or boxing required! 
4

se declara una Lista de Foo objetos de esta manera:

List<Foo> fooList; 

La de el nombre de tipo es un marcador de posición para el tipo de objeto 'real' que ingresa en la lista genérica en el momento en que lo instancia.

5

Considere T como nombre de variable. Debe especificar su valor, es decir, hacer la clase genérica 'específica'. Por lo tanto, puede crear List<string>, List<int> o List de cualquier otra cosa que desee.

3

Cuando haga un List<Object>, asegúrese de que su clase Object sea pública. En las instalaciones VS predeterminadas, las clases salen de fábrica como 'internas', lo que significa que no puede hacer una lista de ellas porque son menos accesibles que la lista pública que está declarando.

Esto me dio um ... ayer. Estúpido por defecto

6

Lo que hace que una "lista genérica" ​​sea genérica es el hecho de que puede usar la misma clase para crear una lista de manzanas y una lista de papas. Por supuesto, una vez que crea una lista con el operador new, debe decidir qué objetos desea que almacene y comunicar su decisión poniendo el nombre de tipo de los objetos que almacena en el <>.

La siguiente línea en realidad le dice al compilador:

List<Employee> employeeList = new List<Employee>(); 

"Hey, necesito una lista que puede manejar objetos de tipo Employee; y lleva el nombre employeeList"

El objeto de lista que obtienes de esa manera ya no es genérico. Solo aceptará y devolverá objetos del tipo Employee. Pero el comportamiento de la lista se define de una manera "genérica" ​​que no le importa con qué objetos está trabajando en realidad. Simplemente los llama 'T' internamente porque para todo lo que se supone que debe hacer la lista, su tipo de contenido realmente no importa.

Cuestiones relacionadas