由于所有内容都是从对象继承的,因此List<T>
和List<object>
之间有什么区别?好处?缺点
答案 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>
将处理的值类型,而无需对值进行装箱和取消装箱。
您还牺牲了类型安全性,这可能会导致运行时错误。