C# 泛型 Generic
c# 泛型 generic
泛型(generic) 允許您延遲編寫類或方法中的編程元素的數(shù)據(jù)類型的規(guī)范,直到實(shí)際在程序中使用它的時(shí)候。換句話說,泛型允許您編寫一個(gè)可以與任何數(shù)據(jù)類型一起工作的類或方法。
您可以通過數(shù)據(jù)類型的替代參數(shù)編寫類或方法的規(guī)范。當(dāng)編譯器遇到類的構(gòu)造函數(shù)或方法的函數(shù)調(diào)用時(shí),它會生成代碼來處理指定的數(shù)據(jù)類型。下面這個(gè)簡單的范例將有助于您理解這個(gè)概念:
using system; using system.collections.generic; namespace genericapplication { ? ? public class mygenericarray<t> ? ? { ? ? ? ? private t[] array; ? ? ? ? public mygenericarray(int size) ? ? ? ? { ? ? ? ? ? ? array = new t[size + 1]; ? ? ? ? } ? ? ? ? public t getitem(int index) ? ? ? ? { ? ? ? ? ? ? return array[index]; ? ? ? ? } ? ? ? ? public void setitem(int index, t value) ? ? ? ? { ? ? ? ? ? ? array[index] = value; ? ? ? ? } ? ? } ? ? ? ? ? ? ? ? class tester ? ? { ? ? ? ? static void main(string[] args) ? ? ? ? { ? ? ? ? ? ? // 聲明一個(gè)整型數(shù)組 ? ? ? ? ? ? mygenericarray<int> intarray = new mygenericarray<int>(5); ? ? ? ? ? ? // 設(shè)置值 ? ? ? ? ? ? for (int c = 0; c < 5; c++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? intarray.setitem(c, c*5); ? ? ? ? ? ? } ? ? ? ? ? ? // 獲取值 ? ? ? ? ? ? for (int c = 0; c < 5; c++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? console.write(intarray.getitem(c) + " "); ? ? ? ? ? ? } ? ? ? ? ? ? console.writeline(); ? ? ? ? ? ? // 聲明一個(gè)字符數(shù)組 ? ? ? ? ? ? mygenericarray<char> chararray = new mygenericarray<char>(5); ? ? ? ? ? ? // 設(shè)置值 ? ? ? ? ? ? for (int c = 0; c < 5; c++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? chararray.setitem(c, (char)(c+97)); ? ? ? ? ? ? } ? ? ? ? ? ? // 獲取值 ? ? ? ? ? ? for (int c = 0; c < 5; c++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? console.write(chararray.getitem(c) + " "); ? ? ? ? ? ? } ? ? ? ? ? ? console.writeline(); ? ? ? ? ? ? console.readkey(); ? ? ? ? } ? ? } }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會產(chǎn)生下列結(jié)果:
0 5 10 15 20 a b c d e
1. 泛型(generic)的特性
使用泛型是一種增強(qiáng)程序功能的技術(shù),具體表現(xiàn)在以下幾個(gè)方面:
- 它有助于您最大限度地重用代碼、保護(hù)類型的安全以及提高性能。
- 您可以創(chuàng)建泛型集合類。.net 框架類庫在 system.collections.generic 命名空間中包含了一些新的泛型集合類。您可以使用這些泛型集合類來替代 system.collections 中的集合類。
- 您可以創(chuàng)建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托。
- 您可以對泛型類進(jìn)行約束以訪問特定數(shù)據(jù)類型的方法。
- 關(guān)于泛型數(shù)據(jù)類型中使用的類型的信息可在運(yùn)行時(shí)通過使用反射獲取。
2. 泛型(generic)方法
在上面的范例中,我們已經(jīng)使用了泛型類,我們可以通過類型參數(shù)聲明泛型方法。下面的程序說明了這個(gè)概念:
using system; using system.collections.generic; namespace genericmethodappl { ? ? class program ? ? { ? ? ? ? static void swap<t>(ref t lhs, ref t rhs) ? ? ? ? { ? ? ? ? ? ? t temp; ? ? ? ? ? ? temp = lhs; ? ? ? ? ? ? lhs = rhs; ? ? ? ? ? ? rhs = temp; ? ? ? ? } ? ? ? ? static void main(string[] args) ? ? ? ? { ? ? ? ? ? ? int a, b; ? ? ? ? ? ? char c, d; ? ? ? ? ? ? a = 10; ? ? ? ? ? ? b = 20; ? ? ? ? ? ? c = 'i'; ? ? ? ? ? ? d = 'v'; ? ? ? ? ? ? // 在交換之前顯示值 ? ? ? ? ? ? console.writeline("int values before calling swap:"); ? ? ? ? ? ? console.writeline("a = {0}, b = {1}", a, b); ? ? ? ? ? ? console.writeline("char values before calling swap:"); ? ? ? ? ? ? console.writeline("c = {0}, d = {1}", c, d); ? ? ? ? ? ? // 調(diào)用 swap ? ? ? ? ? ? swap<int>(ref a, ref b); ? ? ? ? ? ? swap<char>(ref c, ref d); ? ? ? ? ? ? // 在交換之后顯示值 ? ? ? ? ? ? console.writeline("int values after calling swap:"); ? ? ? ? ? ? console.writeline("a = {0}, b = {1}", a, b); ? ? ? ? ? ? console.writeline("char values after calling swap:"); ? ? ? ? ? ? console.writeline("c = {0}, d = {1}", c, d); ? ? ? ? ? ? console.readkey(); ? ? ? ? } ? ? } }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會產(chǎn)生下列結(jié)果:
int values before calling swap: a = 10, b = 20 char values before calling swap: c = i, d = v int values after calling swap: a = 20, b = 10 char values after calling swap: c = v, d = i
3. 泛型(generic)委托
您可以通過類型參數(shù)定義泛型委托。例如:
delegate t numberchanger<t>(t n);
下面的范例演示了委托的使用:
using system; using system.collections.generic; delegate t numberchanger<t>(t n); namespace genericdelegateappl { ? ? class testdelegate ? ? { ? ? ? ? static int num = 10; ? ? ? ? public static int addnum(int p) ? ? ? ? { ? ? ? ? ? ? num += p; ? ? ? ? ? ? return num; ? ? ? ? } ? ? ? ? public static int multnum(int q) ? ? ? ? { ? ? ? ? ? ? num *= q; ? ? ? ? ? ? return num; ? ? ? ? } ? ? ? ? public static int getnum() ? ? ? ? { ? ? ? ? ? ? return num; ? ? ? ? } ? ? ? ? static void main(string[] args) ? ? ? ? { ? ? ? ? ? ? // 創(chuàng)建委托范例 ? ? ? ? ? ? numberchanger<int> nc1 = new numberchanger<int>(addnum); ? ? ? ? ? ? numberchanger<int> nc2 = new numberchanger<int>(multnum); ? ? ? ? ? ? // 使用委托對象調(diào)用方法 ? ? ? ? ? ? nc1(25); ? ? ? ? ? ? console.writeline("value of num: {0}", getnum()); ? ? ? ? ? ? nc2(5); ? ? ? ? ? ? console.writeline("value of num: {0}", getnum()); ? ? ? ? ? ? console.readkey(); ? ? ? ? } ? ? } }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會產(chǎn)生下列結(jié)果:
value of num: 35 value of num: 175