2011-08-26 15 views

Respuesta

11

Si inserta un int en List<object>, estará en caja. Si lo inserta en List<int>, no se insertará (esto es cierto para cualquier tipo de valor, reemplazando int por el nombre del tipo). De manera similar, para recuperar valores del List<object>, se producirá unboxing, pero no para List<int>.

List<T> está fuertemente tipado, List<object> no es (por lo que pierde seguridad en tiempo de compilación, y puede golpear funcionamientos en tiempo de ejecución).

+0

. Excelente respuesta. Tendrá en cuenta el boxeo/desempaquetado – Xaisoft

4

Si usa List<object>, no tendrá que escribir ningún elemento y tendrá que echar todo. Además, eso es peligroso porque puedes poner cualquier cosa en la lista y no saber exactamente lo que estás recibiendo por un artículo determinado.

+0

Gracias por arreglar los soportes, John. Solo me estaba dirigiendo a hacer eso. –

+0

Al decir "... elemento escribiendo ...", ¿quiere decir que no podré acceder a las propiedades o métodos hasta que realice un reparto? – Xaisoft

+0

Eso, más el tiempo de compilación, admite que está agregando el tipo correcto de elemento a la colección. El inconveniente más obvio, sin embargo, es no poder interactuar con el objeto sin lanzar, sí. –

9

si tiene List<T>, está seguro de que una vez que se crea una instancia del objeto, la lista solo contiene instancias del tipo T, en un List<object> puede colocar cualquier cosa dentro.

Los genéricos son una buena forma de escribir códigos reutilizables que tengan tipos fuertes en tiempo de compilación de todos modos.

+0

Entonces, si la Lista puede contener diferentes tipos, ¿es mejor usar objeto? – Xaisoft

+1

Buena respuesta por cierto. No pensé en la seguridad del tipo con la lista en comparación con la lista Xaisoft

2

La lista toma un tipo genérico como el argumento de la plantilla. Por lo tanto, usted realmente tener una lista de los coches si usted:

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

Considerando lo siguiente:

List<object> objlist = new List<object>(); 

puede sostener referencias a nada. El problema es que estas referencias se descuentan a objetos y no puede usar sus miembros y funciones hasta que los reelabore con el objeto correcto. Por ejemplo, si usted llevó a cabo en coches objlist, que tendría que hacer:

((car)objlist[0]).GetMaker(); 

Para llamar a los coches GetMaker wehreas de función con la lista que podría hacer:

list[0].GetMaker(); 

Esto supone que tiene al menos un auto/obj en la lista.

+0

Buen ejemplo. Me ayudó a entender mejor. – Xaisoft

0

La pregunta es un poco confusa, pero creo que jsmarble ha llegado a uno de los puntos principales en el sentido de que tendrá que lanzar todo al tipo que necesite. El es ineficiente, especialmente con los tipos de valor que List<T> manejará sin tener que encajonar y desempaquetar el valor.

También sacrifica seguridad de tipo que potencialmente podría provocar errores de tiempo de ejecución.

1

Puede considerar T como una restricción de tipo en la Lista. Así que si usted dice

class Vehicle {} 
class Car : Vehicle {} 
class Boat : Vehicle {} 
class SpeedBoat : Boat {} 
List<Boat> listOfBoats 

La lista sólo puede contener un tipo de barco y es descendientes, pero no a otros vehículos. Si lo había configurado para objetar, la Lista básicamente podría contener cualquier tipo de referencia.

Tenga en cuenta que si desea, p.todos los SpeedBoats de esa colección pueden usar el agradable método de extensión OfType:

//Returns IEnumerable<SpeedBoat>, casting is done for you 
var speedBoats = listOfBoats.OfType<SpeedBoat>(); 
+0

La lista me permitiría usar el automóvil y el barco, ¿correcto? y dado que SpeedBoat hereda de Boat que hereda de Vehicle, ¿podría hacer la lista o tengo que usar la extensión OfType? – Xaisoft

+0

Sí una Lista (de vehículos) puede contener un automóvil, bote, lancha rápida, cualquier descendiente del vehículo. La lista NO permitiría, p. .Add (barco nuevo()). Si desea una lista fuera de una lista poblada , entonces podría decir List sbs = vehicles.OfTipo () – edvaldig

Cuestiones relacionadas