一.先让咱们认识一下泛型。程序员
1.1什么是泛型?算法
1.1.1泛型是程序设计语言的一种特性。容许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须做出指明。各类程序设计语言和其编译器、运行环境对泛型的支持均不同。将类型参数化以达到代码复用提升软件开发工做效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。c#
—百度百科数据结构
1.1.2上面是比较官方的解释,下面说说我得理解吧,泛型实际上是一种为了减小咱们代码量而引入的一种模板,在这个模板中主要封装一些特殊的算法,让咱们能够在处理一些不一样类型的数据但对数据的处理具备相同的逻辑算法时,只须要写出一个模板,就能够处理多种数据类型的方法,无需为每种类型都写一个处理方法函数
1.2在c#中的经常使用泛型性能
1.2.1在c#中咱们能够定义泛型类,泛型接口,泛型方法,泛型委托 。。。在这里我就不一 一列举了this
a. 泛型类的定义格式spa
修饰符 class 类名<T,U,.....>{ 类成员 }设计
例:code
//简单的泛型类
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]; } }