C#泛型如何應(yīng)用

這篇文章主要介紹“C#泛型如何應(yīng)用”,在日常操作中,相信很多人在C#泛型如何應(yīng)用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C#泛型如何應(yīng)用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,先為輝縣等服務(wù)建站,輝縣等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為輝縣企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

我們?cè)诰帉慍#程序的時(shí)候,經(jīng)常遇到兩個(gè)模塊的功能非常相似,只是一個(gè)是處理int類型,另一個(gè)是處理string類型,或者是其他自定義的數(shù)據(jù)類型,但我們沒(méi)有其他的解決方案,只能各自寫多個(gè)方法處理每個(gè)數(shù)據(jù)類型,因?yàn)榉椒ǖ膮?shù)類型不同。那么是否有一個(gè)辦法,在方法中傳入通用的數(shù)據(jù)類型,這樣就可以合并代碼了。C#泛型應(yīng)用正是為解決這個(gè)問(wèn)題的。C#泛型應(yīng)用可以解決什么樣的問(wèn)題呢?我們先看下面的代碼,代碼中省略了一些內(nèi)容,但功能是實(shí)現(xiàn)一個(gè)棧,這個(gè)棧只能處理int數(shù)據(jù)類型:

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]; }  }

上面的代碼運(yùn)行得很好,但是,如果我們需要一個(gè)棧來(lái)保存string類型的數(shù)據(jù)時(shí)呢?或許很多人都會(huì)想到把上面的代碼copy一份,把int改成string就可以了。當(dāng)然,這樣做,是沒(méi)問(wèn)題的,但是如果以后需要long,Node類型的棧該怎么辦?繼續(xù)復(fù)制?這里有種折衷的辦法,是使用一個(gè)通用的數(shù)據(jù)類型object來(lái)實(shí)現(xiàn)這個(gè)棧:

public class Stack  {     private object[] m_item;     public object pop() {}     public void push() {}      public Stack(int o){this.m_item = new object [o]}  }

雖然這個(gè)棧很靈活,可以接收任何數(shù)據(jù)類型。但全面地說(shuō),也不是沒(méi)有缺陷的,主要表現(xiàn)在:

◆當(dāng)Stack處理值類型時(shí),會(huì)出現(xiàn)裝箱,拆箱操作,這將在托管堆上分配和回收大量的變量,若數(shù)據(jù)量大,則性能損失非常嚴(yán)重。

◆在處理引用類型時(shí),雖然沒(méi)有裝箱和拆箱操作,但將用到數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換操作,增加了處理器的負(fù)擔(dān)。

在數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換上還有更嚴(yán)重的問(wèn)題,如下:

Node1 x = new Node1();  stack.push(x);  Node2 y = (Node2)stack.pop();

上面的代碼在編譯時(shí)是沒(méi)有問(wèn)題的,但是由于push了一個(gè)Node1類型的數(shù)據(jù),但在pop時(shí)卻要求轉(zhuǎn)換為Node2類型,這將出現(xiàn)程序運(yùn)行時(shí)的類型轉(zhuǎn)換異常,但卻逃離了編譯器的檢查。
針對(duì)object類型棧的問(wèn)題,我們引入泛型,他可以很優(yōu)雅地解決這些問(wèn)題。泛型用一個(gè)通過(guò)的數(shù)據(jù)類型T來(lái)代替object,在類實(shí)例化時(shí)指定T的類型,運(yùn)行時(shí)(Runtime)自動(dòng)編譯為本地代碼,運(yùn)行效率和代碼質(zhì)量都有很大的提高,并且保證數(shù)據(jù)類型安全。

C# 泛型應(yīng)用實(shí)例:

下面是使用泛型來(lái)重寫上面的棧,用一個(gè)通用的數(shù)據(jù)類型T來(lái)作為一個(gè)占位符,等待在實(shí)例化時(shí)用一個(gè)實(shí)際的類型來(lái)替換。如下:

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];     }  }

類的寫法不變,只是引入了通用數(shù)據(jù)類型T就可以適用于任何數(shù)據(jù)類型,并且類型安全的。這個(gè)類的調(diào)用方法:

Stack﹤int﹥ a = new Stack﹤int﹥(100);  a.push(10);  a.push("10"); //這里編譯不通過(guò),因?yàn)轭恆只接收int類型的數(shù)據(jù)  int x = a.pop();   Stack﹤string﹥ b = new Stack﹤string﹥(100);  b.push(10); //這里編譯不通過(guò),因?yàn)轭恇只接收string類型的數(shù)據(jù)庫(kù)  b.push("10");  string y = b.pop();

這個(gè)類和object實(shí)現(xiàn)的類有截然不同的區(qū)別:

1. 他是類型安全的。實(shí)例化了int類型的棧,就不能處理string類型的數(shù)據(jù),其他數(shù)據(jù)類型也一樣;

2. 無(wú)需裝箱和拆箱。這個(gè)類在實(shí)例化時(shí),按照鎖傳入的數(shù)據(jù)類型生成本地代碼,本地代碼數(shù)據(jù)類型已確定,所以無(wú)需裝箱和拆箱。

3. 無(wú)需數(shù)據(jù)類型轉(zhuǎn)換。

到此,關(guān)于“C#泛型如何應(yīng)用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

網(wǎng)站欄目:C#泛型如何應(yīng)用
URL鏈接:http://www.muchs.cn/article4/geesoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)