早在机房收费系统的时候就开始学习和使用泛型了,那是并不很清楚泛型和泛型集合的区别,一直以为泛型集合就是泛型。
后来继续学习,认识到泛型和泛型集合之间的区别,却不清楚到底体现在哪。
通过这次技术分享,到现在才对泛型有了一个比较清晰的认识,既是一种收获和成长,同时也很惭愧,对这些非常常用的技术并没有进行过深入研究。
在以后的学习中,还是要善于研究问题,不能总是“见过”——看见就过了。
下面将从基本的概念开始好好分析一下泛型。
先从百度抄一段概念:泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。这里的可变部分是关键,指的就是类型参数,这个不懂没关系,我们下面分析。
1、我们为什么要用泛型?
先看如下的两段代码:
public class Cat
{
public void CountEars(int[] catEars)
{
//定义一个数耳朵的方法
int length = catEars.Length;
for (int i = 0; i < length-1; i++)
{
Console.WriteLine(length+"int类型参数");
}
}
public void CountEars(string[] catEars)
{
//定义一个数耳朵的方法
int length = catEars.Length;
for (int i = 0; i < length-1; i++)
{
Console.WriteLine(length+"string类型参数");
}
}
}
class Program
{
static void Main(string[] args)
{
#region 没有泛型前的演示
Cat cats = new Cat();
int[] catInt = { 1, 2, 3, 4, 5 };//这些猫称为1/2/3/4/5
byte[] catString = { 1, 2, 3, 4, 5 };
//输出数组长度
cats.CountEars(catInt)
//输出数组长度
cats.CountEars(catString);
没有泛型的话,
如果
我还要使用其他参数类型的同名方法的话,还要继续写其他的方法,这样我们看着肯定非常不舒服,也非常麻烦,而这样也不符合科学的计算机编程。
那么我们面对这种情况,该怎么用泛型?接着看泛型类和泛型方法的使用。
2、泛型类与泛型方法
泛型类:
public class Cat<span style="font-family: Arial, Helvetica, sans-serif;"><T></span>
{ public void CountEars(T[] catEars)
//定义一个数猫耳朵的方法
int length = catEars.Length;
for (int i = 0; i < length-1; i++)
{
Console.WriteLine(length+"泛型类型参数");
}
} }
泛型方法:
//定义一个数耳朵的方法
public void CountEars(T[] catEars)
{
int length = catEars.Length;
for (int i = 0; i < length - 1; i++)
{
Console.WriteLine(length + "泛型类型参数");
}
}
为什么要使用泛型方法呢?因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。
为什么使用泛型类呢?使用泛型类可以解决重复业务的代码的复用问题,也就是业务颗粒的复用,同时使用泛型类型在编译阶段就可以确定,并发现错误,类型的转换都是自动和隐式的,提高了代码的准确率和复用率。
3、泛型、集合、泛型集合
告诉大家三个字:先别乱!
集合:如ArrayList类,是命名空间System.Collections下的一部分,它是使用大小可按需动态增加的数组实现IList接口,但是ArrayList不是类型安全的。同样,Hashtable也是集合类的一种。
ArrayList arraylist = new ArrayList();
arraylist.Add("a");
arraylist.Add("b");
arraylist.Add("c");
arraylist.RemoveAt(1);
Response.Write(arraylist[0].ToString());
Response.Write(arraylist[1].ToString());
这是一个集合的例子。ArrayList必须通过创建一个实例必须进行实例化,不能像数组那样直接赋值通过Add()方法添加元素,然后通过RemoveAt方法删除元素,它的索引会自动调整。
ArrayList添加元素时都是 object类型,如果添加一个值类型,就需要把它转化为引用类型,这里就需要装箱,拆箱。而这正是集合类型不安全的体现,有的语言中提供了隐式拆装箱的机制,这还会导致效率降低。
泛型集合:如List类,是对ArrayList的一个完善。通常情况下建议使用泛型集合,因为这样可以获得类型安全的直接优点。同时,Dictionary也是泛型集合类。
List<string> aList = new List<int>();
aList.Add("a");
aList.Add("b");
此时,如果我在上面的代码中加入一行:aList.Add(1.0),此时编译器就会报错。为什么?
因为泛型是类型安全的,它不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,它在编译期间就会提示你类型错误,1.0显然不是string类型。
泛型:泛型我们指的就是实现IList接口的数组之类的集合类型,它存储的是其父类型,而实现使用时声明好子类型。参考泛型集合类的实现过程,我们发现,泛型和泛型集合,实际上是同一概念。
小结:一般情况下,我们优先考虑强制类型,如定义一个string类型;其次考虑泛型,最后考虑集合。泛型是基础的必须好好掌握的技术点,需要我们好好研究和实践。