標籤:color facet 運行環境 span 類型 設計 提高 工作 struct
一.先讓我們認識一下泛型。
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]; }}
C#泛型的初步理解