List <t>和List <object>之间的区别?</object> </t>

时间:2011-08-26 14:27:10

标签: c# .net generics

由于所有内容都是从对象继承的,因此List<T>List<object>之间有什么区别?好处?缺点

6 个答案:

答案 0 :(得分:12)

如果您将int插入List<object>,则会将其装箱。如果将其插入List<int>,则不会将其装箱(对于任何值类型都是如此,将int替换为类型名称)。同样,对于从List<object>检索值,会发生取消装箱,但不会发生List<int>

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

答案 1 :(得分:10)

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

无论如何,泛型是编写具有强类型的可重用代码的好方法。

答案 2 :(得分:5)

如果您使用List<object>,则不会输入任何项目,并且必须投射所有内容。另外,这很危险,因为您可以将任何内容放入列表中,并且无法确切知道您为任何给定项目获取的内容。

答案 3 :(得分:2)

List采用泛型类型作为模板参数。所以,如果你这样做,你将真正拥有一份汽车清单:

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

鉴于:

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

可以保留对任何内容的引用。问题是,这些引用被下载到对象,并且在将它们重新转换为正确的对象之前,您不能使用它们的成员和函数。例如,如果您在objlist中持有汽车,则必须执行以下操作:

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

使用您可以执行的列表调用汽车GetMaker函数wehreas:

list[0].GetMaker();

这假设您在列表中至少有一个car / obj。

答案 4 :(得分:1)

您可以将T视为List上的类型约束。所以,如果你说

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

该列表只能包含一种船类及其后代,但不包含任何其他车辆。如果您已将其设置为object,则List基本上可以包含任何引用类型。

请注意,如果您需要,例如来自该集合的所有SpeedBoats都可以使用漂亮的扩展方法OfType:

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

答案 5 :(得分:0)

这个问题有点令人困惑,但我认为jsmarble已经触及了一个主要问题,你必须将所有东西都投射到你需要的类型。这是低效的,尤其是List<T>将处理的值类型,而无需对值进行装箱和取消装箱。

您还牺牲了类型安全性,这可能会导致运行时错误。