由于所有东西都继承自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();
list[0].GetMaker();
你可以将 T 视为 List 的类型约束。因此,如果你说
class Vehicle {}
class Car : Vehicle {}
class Boat : Vehicle {}
class SpeedBoat : Boat {}
List<Boat> listOfBoats
//Returns IEnumerable<SpeedBoat>, casting is done for you
var speedBoats = listOfBoats.OfType<SpeedBoat>();
List<T>
可以很好地处理它们。