谁能教教我泛型(Generics)是什么?干什么用的?为什么存在?

时间:2022-11-22 10:34:09
RT
看书,作者自顾说自己的话,代码能看懂,语法很别扭,不知道为什么要这样做,不知道为什么才存在这玩意,这样做有什么好处呢?牛人能否说说自己的感悟?谢谢了

10 个解决方案

#1


泛型就是替你省写代码的,简单的例子就是List,列表在数据结构中描述的很清晰,有些什么操作,但item类型固定的,如果一定要做个通用的类型,就是object,但这样对值类型的装箱带来性能的损失不可忽视,为了效率,可能就需要写IntList,如果还要long的List,string的List就要一样代码写好多次类型不同,泛型就能解决这个问题,写一次代码,吧可以公共替代的类型作为一个类的参数,动态配置,这样一份List<T>就可以支撑任意类型的List了。

c#的泛型是运行时决定的,所以你可以独立编写泛型类。c++的泛型是编译时决定的,多一种类型,系统就替你用模板类多生成一份代码。

#2


强类型,避免装/拆箱

#3


具体类型,方便编码,比Object,强

#4


不同类型的泛型实例是不一样的,所以可以针对不同类型作缓存

#5


   什么装箱拆箱我不懂。一般我绑定数据的时候就用list《T》。我就这样用。。。

#6


类型参数化,形成强类型,同时以免拆装箱带来的开销

#7


范型的意义在于免去了类型之间互相转换的系统开销,和同类方法的重载,

比如,Add方法你要重载两个方法(int和double)或者更多方法,用范型只用写一个Add方法就可以完成int,double,float......等等的相加,

再如,集合的操作,没有往往是弱类型(object),而用范型可以直接是强类型,无需转换之间的开销,节省了资源,这个比较详细:


http://hi.baidu.com/z_08/blog/item/6f5b114ef89c5ecad1c86ab2.html

#8


感谢诸位,稍微明白点意思了。

#9


额,假设说,湖南电视台说要搞一个BT转场PK大赛,现在海选

目前准备报名的有 :“刘著”,“李宇春”,“芙蓉”,“小月月”,“张学友”,“刘德华”

现在报名现场工作人员,准备接受报名

IEnumerable<BT>  报名处理(list<报名人员> _list)
{
   foreeach (人 演员 in _list)
  {
     if(演员 is BT) //额,刘著,李宇春,芙蓉,小月月过关他们继承IBT接口,张学友,刘德华pass他们只实现了演员类而没实现IBT接口
     yield return 演员
  }
}

#10


感谢!这个例子应该放博客保存!

引用 9 楼 wanghui0380 的回复:
额,假设说,湖南电视台说要搞一个BT转场PK大赛,现在海选

目前准备报名的有 :“刘著”,“李宇春”,“芙蓉”,“小月月”,“张学友”,“刘德华”

现在报名现场工作人员,准备接受报名

IEnumerable<BT> 报名处理(list<报名人员> _list)
{
  foreeach (人 演员 in _list)
  {
  if(演员 is BT) //额,刘著,李……

#1


泛型就是替你省写代码的,简单的例子就是List,列表在数据结构中描述的很清晰,有些什么操作,但item类型固定的,如果一定要做个通用的类型,就是object,但这样对值类型的装箱带来性能的损失不可忽视,为了效率,可能就需要写IntList,如果还要long的List,string的List就要一样代码写好多次类型不同,泛型就能解决这个问题,写一次代码,吧可以公共替代的类型作为一个类的参数,动态配置,这样一份List<T>就可以支撑任意类型的List了。

c#的泛型是运行时决定的,所以你可以独立编写泛型类。c++的泛型是编译时决定的,多一种类型,系统就替你用模板类多生成一份代码。

#2


强类型,避免装/拆箱

#3


具体类型,方便编码,比Object,强

#4


不同类型的泛型实例是不一样的,所以可以针对不同类型作缓存

#5


   什么装箱拆箱我不懂。一般我绑定数据的时候就用list《T》。我就这样用。。。

#6


类型参数化,形成强类型,同时以免拆装箱带来的开销

#7


范型的意义在于免去了类型之间互相转换的系统开销,和同类方法的重载,

比如,Add方法你要重载两个方法(int和double)或者更多方法,用范型只用写一个Add方法就可以完成int,double,float......等等的相加,

再如,集合的操作,没有往往是弱类型(object),而用范型可以直接是强类型,无需转换之间的开销,节省了资源,这个比较详细:


http://hi.baidu.com/z_08/blog/item/6f5b114ef89c5ecad1c86ab2.html

#8


感谢诸位,稍微明白点意思了。

#9


额,假设说,湖南电视台说要搞一个BT转场PK大赛,现在海选

目前准备报名的有 :“刘著”,“李宇春”,“芙蓉”,“小月月”,“张学友”,“刘德华”

现在报名现场工作人员,准备接受报名

IEnumerable<BT>  报名处理(list<报名人员> _list)
{
   foreeach (人 演员 in _list)
  {
     if(演员 is BT) //额,刘著,李宇春,芙蓉,小月月过关他们继承IBT接口,张学友,刘德华pass他们只实现了演员类而没实现IBT接口
     yield return 演员
  }
}

#10


感谢!这个例子应该放博客保存!

引用 9 楼 wanghui0380 的回复:
额,假设说,湖南电视台说要搞一个BT转场PK大赛,现在海选

目前准备报名的有 :“刘著”,“李宇春”,“芙蓉”,“小月月”,“张学友”,“刘德华”

现在报名现场工作人员,准备接受报名

IEnumerable<BT> 报名处理(list<报名人员> _list)
{
  foreeach (人 演员 in _list)
  {
  if(演员 is BT) //额,刘著,李……