泛型
來源:程序員人生 發(fā)布時(shí)間:2015-04-03 08:18:34 閱讀次數(shù):3100次
泛型概念:
泛型是公共語言運(yùn)行時(shí)和編程語言提供的1種機(jī)制,它支持另外1種情勢的代碼重用,也就是算法重用.
泛型包括泛型類,泛型接口,泛型拜托,泛型方法,并不是只包括簡單的泛型類.在C#中,其他例如,屬性,索引器,事件,操作符方法,構(gòu)造器本身不能有類型參數(shù)T.
T(類型參數(shù)),它的目的在于指明它操作的是1個(gè)未指定的數(shù)據(jù)類型,在源代碼中能夠使用數(shù)據(jù)類型的地方都可使用它.
為何要使用泛型
通過使用泛型,可以極大地提高代碼的重用度,同時(shí)還可以取得強(qiáng)類型的支持,提升了利用程序的性能,避免了隱式的裝箱、拆箱,和運(yùn)行時(shí)的類型轉(zhuǎn)換毛病。
提高代碼復(fù)用
冒泡算法
不用泛型的情況下,如果是整數(shù)類型排序,下面代碼中“?“就應(yīng)為int類型,但如果這時(shí)候候我們有需要給byte類型排序,就要復(fù)制1遍代碼,然后把int改成byte。這明顯不能體現(xiàn)代碼的復(fù)用。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class SortHelper {
public void BubbleSort(?[] array) {
int length = array.Length;
for (int i = 0; i <= length - 2; i++) {
for (int j = length - 1; j >= 1; j--) {
// 對兩個(gè)元素進(jìn)行交換
if (array[j] < array[j - 1]) {
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
}
</strong></span>
做網(wǎng)站為了提高代碼復(fù)用,我們通常使用模板它的具體做法是:每次生成靜態(tài)頁面時(shí),先加載模板,模板中含有1些用特殊字符標(biāo)記的占位符,然后從數(shù)據(jù)庫讀取數(shù)據(jù),使用讀出的數(shù)據(jù)將模板中的占位符替換掉。
將上面的方法視為1個(gè)模板,將方法所操作的類型視為1個(gè)占位符,由因而1個(gè)占位符,因此可以代表任何的類型,這和靜態(tài)頁面生成時(shí)模板的占位符可以用來代表來自數(shù)據(jù)庫中的任何數(shù)據(jù)道理是1樣的。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>public class SortHelper<T> {
public void BubbleSort(T[] array){
// 冒泡排序方法實(shí)現(xiàn)體
}
}
</strong></span>
在類型名稱的后面加了1個(gè)尖括號,使用這個(gè)尖括號來傳遞占位符,也就是類型參數(shù)。
接下來,看1下如何使用泛型。
當(dāng)需要為1個(gè)int類型的數(shù)組排序時(shí):
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>SortHelper<int> sorter = new SortHelper<int>();
int[] array = { 8, 1, 4, 7, 3 };
sorter.BubbleSort(array);
</strong></span>
當(dāng)需要為1個(gè)byte類型的數(shù)組排序時(shí):
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>SortHelper<byte> sorter = new SortHelper<byte>();
byte [] array = { 8, 1, 4, 7, 3 };
sorter.BubbleSort(array);
</strong></span>
性能對照
拆裝箱
1. 裝箱在值類型向援用類型轉(zhuǎn)換時(shí)產(chǎn)生
2. 拆箱在援用類型向值類型轉(zhuǎn)換時(shí)產(chǎn)生
代碼演示
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
const int ListSize = 500000;
static void Main(string[] args)
{
UseArrayList();
UseGenericList();
Console.ReadKey();
}
private static void UseArrayList()
{
ArrayList list = new ArrayList();
long startTicks = DateTime.Now.Ticks;
for (int i = 0; i < ListSize; i++)
{
list.Add(i);//i為int類型,list為援用類型, 存在1個(gè)裝箱操作
}
for (int i = 0; i < ListSize; i++)
{
int value = (int)list[i];//list[i]為援用類型,value為int類型。 進(jìn)行1個(gè)拆箱操作
}
long endTicks = DateTime.Now.Ticks;
Console.WriteLine("使用ArrayList,耗時(shí):{0} ticks", endTicks - startTicks);
}
private static void UseGenericList()
{
List<int> list = new List<int>();
long startTicks = DateTime.Now.Ticks;
for (int i = 0; i < ListSize; i++)
{
list.Add(i);
}
for (int i = 0; i < ListSize; i++)
{
int value = list[i];
}
long endTicks = DateTime.Now.Ticks;
Console.WriteLine("使用List<int>,耗時(shí):{0} ticks", endTicks - startTicks);
}
}
}
</strong></span>
運(yùn)行效果

類型安全
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>ArrayList list = new ArrayList();
int i = 100;
list.Add(i);
string value = (string)list[0];
</strong></span>
有些經(jīng)驗(yàn)的同學(xué)就能夠看出這段代碼有問題,由于類型不匹配,添加到ArrayList中的是1
個(gè)int類型,而獲得時(shí)卻想將它轉(zhuǎn)換為string類。但是編譯器不能辨認(rèn),不論是int也好,string也好,它們都是Object類型。在編寫代碼時(shí),編譯器提供給開發(fā)者的最大幫助之1就是可以檢查出毛病,也就是常稱的編譯時(shí)毛?。–ompile time error)。當(dāng)使用ArrayList時(shí),對上面的問題,編譯器無能為力,由于它認(rèn)為其是合法的,編譯可以順利通過。這類毛病有時(shí)候隱藏在程序中很難發(fā)現(xiàn),最糟的情況是產(chǎn)品已交付用戶,而當(dāng)用戶在使用時(shí)不巧履行到這段代碼,便會(huì)拋出1個(gè)異常,這時(shí)候的毛病,稱為運(yùn)行時(shí)毛?。≧untime
error)。
通過使用泛型集合,這類情況將不復(fù)存在,當(dāng)試圖進(jìn)行類似上面的轉(zhuǎn)換時(shí),根本沒法通
過編譯,這樣有助于盡早發(fā)現(xiàn)問題:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>List<int> list = new List<int>();
int i = 100;
list.Add(i);
string value = (string)list[0]; // 編譯毛病
</strong></span>
通過以上這些對照,可以看出泛型給我們編程提供了很大的方便,固然這些只是我查到的1些資料加上自己的整理和實(shí)踐,如有不足的地方請大家批評指正。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)