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>之间的区别是什么?优势呢?缺点呢?

Difference between List<T> and 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>不需要对值进行装箱和拆箱处理的值类型。

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