先看看泛型的概念--“通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用”。
很多初学者在刚开始接触泛型的时候会比较难理解“泛型”在这里先把“泛型”当作一个形容词这样比较方便理解因为很多东西都可以是泛型的比如--
“泛型的类”,“泛型的方法”,“泛型的接口”,“泛型的委托”等...很多时候我们使用泛型可以极大减少代码重复使程序更加清爽,也可以避免不必要的‘装箱’‘拆箱’过程。
<泛型的引入|为什么要有泛型?>
在程序设计的过程中我们常常会遇到这样的情况:为了实现某一个功能我们一开始把方法写好,但后来我们发现同样的功能需要我们再写一次但是这次方法的参数类型和上次不一样了,这个时候按照敏捷软件开发的思想,不要过早的进行抽象和应对变化,当变化第一次出现时,使用最快的方法解决它,但变化第二次出现的时,在进行更好的架构设计,这样的目的是为了避免过度设计,因为有可能第二次变化永远也不会出现。考虑到功能一样,所这里我们通常会直接复制原方法的代码,然后修改一下参数类型即可快速解决;这样做确实没错,但是有的时候不仅出现了第二次变化还出现了第三次...或者是更多次变化,继续使用CV大法修改方法的签名将会导致大量重复代码的出现,于是我们就会想,要是存在一个可以传递任何数据类型的方法那多好,即把这个方法的实现当成模板把方法的签名抽象出来,于是我们引入了泛型。
下面我们来看一下具体的例子:
1.普通的写法:
-输入多个int类型,进行冒泡排序让它们依次重小到大输出,代码如下:
publicclassSortHelper{publicvoidBubbleSort(int[]arr){intlength=arr.Length;for(inti=0;i
//控制台程序输出staticvoidMain(string[]args){SortHelpersorter=newSortHelper();int[]a={4,5,1,3,2,8,5,0,2};sorter.BubbleSort(a);}
输出为:0,1,2,2,3,4,5,5,8
---------------输入多个Byte类型,进行冒泡排序让它们依次重小到大输出,代码如下:
这个时候我只要复制一下原来的方法改一下签名就可以了
publicclassSortHelper{publicvoidBubbleSort(byte[]arr){intlength=arr.Length;for(inti=0;i
1.2使用泛型(泛型类):
我们自然而然的会这样想了如果可以把方法中的参数类型用一个”占位符“表示每次传入什么类型他就变成什么类型,这样就可以将这个方法当成一个模板用了(有点像Web编程中在Html中使用占位符)。
这里我们用“T”来便是这个特殊的参数类型,于是代码就变成了这样:
publicclassSortHelper{publicvoidBubbleSort(T[]arr){intlength=arr.Length;for(inti=0;i
这里T代表”类型的类型“和int,string...等数据类型相似,T就是类型本身。让人兴奋的是真的有像“T”这样的特别存在,在.NET中叫做类型参数.下面我们看看规范的代码--
这里我们把BubbleSort定义成泛型类定义泛型类的一种方法是在类后面加上“
//定义泛型类SortHelper这里“whereT:IComparable”是给类型参数T一个限制--参数类型必须实现IComparable接口,否则无法通过编译publicclassSortHelper
staticvoidMain(string[]args){SortHelper
输出为:
0,1,2,2,3,4,5,5,8
---------------输入多个自定义类型的实例,进行冒泡排序让它们依次重小到大输出,代码如下:
下面我们来模拟一下宠物店卖的猫按价格排序
猫类:
publicclasscat:IComparable{publicstringname;publicintprice;publicintCompareTo(objectobj){catcatT=(cat)obj;returnthis.price.CompareTo(catT.price);}publiccat(stringname,intprice){this.price=price;this.name=name;}}测试:
*泛型与集合类型(ArrayList)
概要:通过泛型可以大大提高集合类型的的性能恶化安全性。
下面我们来看一个例子
2.1非泛型的集合类
先是往集合里存放3个数据
ArrayListlist=newArrayList();intlistSize=3;for(inti=0;i 测试: 输出 0 1 2 有经验的读者在这里可能会注意到了,这样子写虽然能运行通过,但是这里当list每次调用Add方法时就做了一次”装箱“操作,接着每次取数据时对list的元素进行一次强制转换(int)list[i]同时也做了一次“拆箱”操作,这两个操作对.NET来说是比较耗时的,当操作的次数越多效果就越明显; 2.3使用泛型集合类型(泛型数组) 总结: 看到这里相信大家明白为什么要引入泛型了吧,通过使用泛型- 1.可以避免同种功能代码的大幅度重复出现使我们的代码更加简洁/可读性更高