2011-08-26 109 views

回答

11

如果您插入intList<object>,它将被装箱。如果将它插入到List<int>中,它将不会被装箱(对于任何值类型都是如此,用类型名称替换int)。类似地,对于从List<object>检索值,拆箱将发生,但不会出现List<int>

List<T>是强类型的,List<object>不是(所以你会失去编译时的安全性,并且可能会导致运行时间的爆炸)。

+0

很好的答案。将继续拳击/拆箱记 – Xaisoft

4

如果您使用List<object>您将不会有任何项目输入,将不得不投入一切。另外,这很危险,因为你可以将任何东西放入列表中,而不知道你为什么返回任何给定的项目。

+0

感谢您修复括号,约翰。我只是想要这样做。 –

+0

通过“......项目输入...”,你的意思是我将无法访问属性或方法,直到我做演员。 – Xaisoft

+0

加上编译时间支持您正在向集合添加正确类型的项目。但是,最明显的缺点是不能与对象进行交互而不投射,是的。 –

9

如果您有List<T>您确定一旦对象被实例化,该列表只包含T类型的实例,您可以在里面放入任何东西。

泛型是在编译时编写具有强类型的可重用代码的好方法。

+0

因此,如果列表可以包含不同类型,使用对象更好吗? – Xaisoft

+1

顺便说一句好的答案。我没有考虑类型安全与列表而不是列表 Xaisoft

2

列表采用泛型类型作为模板参数。所以,你会真正拥有汽车的列表,如果你这样做:

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

鉴于:

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

可以容纳任何东西引用。问题是,这些引用被降级为对象,并且只有在将它们重写到正确的对象之后,才能使用它们的成员和函数。举例来说,如果你持有objlist汽车,你必须做的:

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

要调用汽车行驶列表GetMaker功能wehreas你可以这样做:

list[0].GetMaker(); 

这里假设你有至少列表中的一辆汽车/ obj。

+0

不错的例子。帮助我更好地理解。 – Xaisoft

0

的问题是有点混乱,但我认为jsmarble已经打在你将要投你的一切需要的类型主要观点之一。这是效率低下的,尤其是对于价值类型而言,List<T>将无需对价值进行装箱和取消装箱。

也牺牲类型安全这可能会导致运行错误。

1

你可以考虑T作为在列表类型约束。所以,如果你说

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

列表只能包含一种类型的船和它的后代,但没有任何其他车辆。如果您已将其设置为对象,则List可基本包含任何引用类型。

注意的是,如果你想如所有来自该集合的SpeedBoats可以使用漂亮的扩展方法OfType:

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

列表将允许我使用汽车和小船,正确吗?并且由于SpeedBoat继承自继承自Vehicle的Boat,我是否可以执行列表还是必须使用OfType扩展? – Xaisoft

+0

是的(车辆列表)可以包含汽车,船,快艇,车辆的后代。列表不允许例如.Add(新船())。如果你想列出一个列表出人口清单那么你可以说列表 sbs = vehicles.OfType () – edvaldig

相关问题