一.先讓我們認識一下泛型。
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]; } }