一.先让我们认识一下泛型。
1.1什么是泛型?
1.1.1泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
—百度百科
1.1.2上面是比较官方的解释,下面说说我得理解吧,泛型其实是一种为了减少我们代码量而引入的一种模板,在这个模板中主要封装一些特殊的算法,让我们可以在处理一些不同类型的数据但对数据的处理具有相同的逻辑算法时,只需要写出一个模板,就可以处理多种数据类型的方法,无需为每种类型都写一个处理方法
1.2在c#中的常用泛型
1.2.1在c#中我们可以定义泛型类,泛型接口,泛型方法,泛型委托 。。。在这里我就不一 一列举了
a. 泛型类的定义格式
修饰符 class 类名<T,U,.....>{ 类成员 }
例:
//简单的泛型类 public class MyClassTemplate<T, U>where T:struct { private T t1; public T T1 { get { return t1; } set { t1 = value; } } private U u1; public U U1 { get { return u1; } set { u1 = value; } } //构造函数 public MyClassTemplate(T t1,U u1) { this.t1 = t1; this.u1 = u1; } public void Print() { Console.WriteLine(t1); } }
b.泛型接口的定义格式
修饰符 interface 接口名<T,U....>{ 声明 }
例
//泛型接口 interface MyInterfaceTemplate<T,U> { void PrintTU(T t1, U u1); }
c.泛型方法的定义格式
修饰符 返回类型 方法名<T,U....>(参数列表){ 函数体 }
例
//简单的泛型函数 public class Myfun { //泛型函数 public static void TempleteFun<T, C>( T x, C y) { T t1 = x; C c1 = y; Console.WriteLine(t1); Console.WriteLine(c1); } }
PS:<>里面代表的是泛型中可被代替的数据类型 。
二.为什么使用泛型
使用泛型行的最大好处就是代码重用,合理的使用泛型可以大大的解决我们编写代码的数量,同时也可以提高我们的程序性能
下面我通过一个简单的例子讲解
现在我们需要一个处理两个数据类型,int 类型和String的数据,他们都需要用到栈的操作,当我没没有泛型的时候需要写出两个栈
的数据结构
2.1 处理int类型
public class Stack { private int[] m_item; public int Pop(){...} public void Push(int item){...} public Stack(int i) { this.m_item = new int[i]; } }
2.2处理字符串类型
public class Stack { private string[] m_item; public string Pop(){...} public void Push(string item){...} public Stack(int i) { this.m_item = new string[i]; } }
2.3当然我们也可以用object代替int 和string类型的
public class Stack { private object[] m_item; public object Pop(){...} public void Push(object item){...} public Stack(int i) { this.m_item = new[i]; } }
2.4上面这个栈可以处理任何数据类型的数据,应为object是所有类的基类。虽然这样写可以处理各种数据类型,但在其中存在这拆箱和装箱,如果数据太多会影响到程序的性能,
因此在c#2.0的时候泛型就此诞生了,他借鉴C++的模板为我们提供了泛型,在使用泛型的时候程序会在编译阶段根据我们提供的类型生成相应的二进制代码,无须进行装箱和拆箱
因此在上面的代码中我们可以使用泛型解决代码如下,这样我们也可以对于任何数据类型都可以使用这个栈了
public class Stack<T> { private T[] m_item; public T Pop(){...} public void Push(T item){...} public Stack(int i) { this.m_item = new T[i]; } }