Difference between List<T> and List<object>?
本文关键字:gt List lt and object between Difference | 更新日期: 2023-09-27 18:06:40
既然所有东西都继承自object,那么List<T>
和List<object>
之间的区别是什么?优势呢?缺点呢?
如果您将int
插入List<object>
,它将被装箱。如果将它插入到List<int>
中,它将不会被装箱(对于任何值类型都是如此,用类型的名称替换int
)。类似地,对于从List<object>
检索值,将会进行拆箱操作,但对于List<int>
则不会。
List<T>
是强类型的,而List<object>
不是(所以你失去了编译时的安全性,并且可能会遇到运行时爆炸)
如果你有List<T>
,你确定一旦对象被实例化,列表只包含T类型的实例,在List<object>
中你可以把任何东西放在里面。
泛型是在编译时编写具有强类型的可重用代码的好方法。
如果您使用List<object>
,您将没有任何项目类型,并且必须强制转换所有内容。另外,这很危险,因为您可以将任何内容放入列表中,而不知道从任何给定项返回的确切内容。
List接受泛型类型作为模板实参。因此,如果您这样做,您将真正拥有一个汽车列表:
List<car> list = new List<car>();
而:
List<object> objlist = new List<object>();
可以保存对任何对象的引用。问题是,这些引用被向下转换为对象,在将它们重新转换为正确的对象之前,您无法使用它们的成员和函数。例如,如果你在objlist中保存汽车,你必须这样做:
((car)objlist[0]).GetMaker();
使用列表调用cars的GetMaker函数,你可以这样做:
list[0].GetMaker();
假设列表中至少有一个car/obj
您可以将T视为List上的类型约束。所以如果你输入
class Vehicle {}
class Car : Vehicle {}
class Boat : Vehicle {}
class SpeedBoat : Boat {}
List<Boat> listOfBoats
列表只能包含一种类型的船和它的后代,但不能包含任何其他车辆。如果您将它设置为object,那么List基本上可以包含任何引用类型。
请注意,如果您想要该集合中的所有快艇,您可以使用很好的扩展方法OfType:
//Returns IEnumerable<SpeedBoat>, casting is done for you
var speedBoats = listOfBoats.OfType<SpeedBoat>();
这个问题有点令人困惑,但我认为jsmarble已经击中了一个要点,因为您必须将所有内容转换为所需的类型。这是低效的,特别是对于List<T>
不需要对值进行装箱和拆箱处理的值类型。
你还牺牲了类型安全,这可能导致运行时错误。