泛型允許您延遲編寫類或方法中的編程元素的數據類型的規范,直到實際在程序中使用它的時候。換句話說,在聲明類或方法的時候由於不知道用戶要傳入什麼樣類型的參數,所以在傳入類型的地方“挖一個坑(“<T>”)",使用它的時候我們再用具體數據類型填上。
根據前面所學知識我們定義一個類:
class Data
{
public int n_data;
}
此時n_data的數據類型已經確定為int類型,所以為他賦值的時候只能為int 類型,如果改寫為下面的泛型類:
class Data
{
public T n_data;
}
此時n_data的數據類型還不確定是什麼類型,所以為他賦值的時候需要指定T也就是n_data的類型,也就是填坑,
Data
Data
當然了,上面的例子中是不能夠指定T為數組的,如果要讓n_data的類型為數組的話,下面的例子可以滿足:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Example { class Data//泛型類 { public T[] n_data; //泛型變量 public Data(int size) //構造方法,new的時候調用構造方法開辟空間 { n_data = new T[size]; } //輸入 public void setdata(int index,T value) { n_data[index] = value; } //輸出 public T getdata(int x) { return n_data[x]; } } class Program { static void Main(string[] args) { Data data = new Data (5); data.n_data[2] = 2; Console.WriteLine(data.n_data[2]); } } }
結果為:2
這個我們以swap交換方法為例,在C++中swap函數是這麼寫的:
#includeusing namespace std; template void swap1(T &a,T &b) //也可以看作泛型 { T temp; temp = a; a = b; b = temp; } int main() { int a=0,b=1; swap1(a,b); cout< 結果: 1 0 如果a與b是字符類型以上函數也適用。C#swap方法如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Example { class data {//swap方法,ref是按地址傳遞 public static void swap(ref T a, ref T b) { T temp; temp = a; a = b; b = temp; } static void Main(string[] args) { string a = HC; string b = 666; swap(ref a,ref b); Console.WriteLine(a+ +b); //結果 666 HC } } }
結果:666 HC 這與C++的倒是很相似啊
泛型委托:
委托也有泛型的,接著上面的例子:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Example { public delegate void MyDelegate();//泛型委托 class Data { private T a; private T b; public void setvalue(T x, T y) { a = x; b = y; } //swap方法,ref是按地址傳遞 public void swap() { T temp; temp = a; a = b; b = temp; } public void printvalue() { Console.WriteLine(a + + b); } } class program { static void Main(string[] args) { Data data = new Data (); data.setvalue(HC,666); MyDelegate my = new MyDelegate (data.swap); my += data.printvalue; my(); //結果 666 HC } } }
結果:
關於泛型就介紹這麼多了,又什麼錯誤的地方歡迎指出^_^