国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

(轉(zhuǎn))C#中的泛型

2019-11-15 02:27:59
字體:
供稿:網(wǎng)友

(轉(zhuǎn))C#中的泛型

來源:http://www.survivalescaperooms.com/JimmyZhang/archive/2008/12/17/1356727.html

.Net 1.1版本最受詬病的一個缺陷就是沒有提供對泛型的支持。通過使用泛型,我們可以極大地提高代碼的重用度,同時還可以獲得強類型的支持,避免了隱式的裝箱、拆箱,在一定程度上提升了應(yīng)用程序的性能。本文將系統(tǒng)地為大家討論泛型,我們先從理解泛型開始。

1.1 理解泛型

1.1.1 為什么要有泛型?

我想不論大家通過什么方式進入了計算機程序設(shè)計這個行業(yè),都免不了要面對數(shù)據(jù)結(jié)構(gòu)和算法這個話題。因為它是計算機科學的一門基礎(chǔ)學科,往往越是底層的部分,對于數(shù)據(jù)結(jié)構(gòu)或者算法的時間效率和空間效率的要求就越高。比如說,當你在一個集合類型(例如ArrayList)的實例上調(diào)用Sort()方法對它進行排序時,.Net框架在底層就應(yīng)用了快速排序算法。.Net框架中快速排序方法名稱叫QuickSort(),它位于Array類型中,這可以通過Reflector.exe工具查看到。

我們現(xiàn)在并不是要討論這個QuickSort()實現(xiàn)的好不好,效率高還是不高,這偏離了我們的主題。但是我想請大家思考一個問題:如果由你來實現(xiàn)一個排序算法,你會怎么做?好吧,我們把題目限定得再窄一些,我們來實現(xiàn)一個最簡單的冒泡排序(Bubble Sort)算法,如果你沒有使用泛型的經(jīng)驗,我猜測你可能會毫不猶豫地寫出下面的代碼來,因為這是大學教程的標準實現(xiàn):

public class SortHelper{ public void BubbleSort(int[] array) { int length = array.Length; for (int i = 0; i <= length - 2; i++) { for (int j = length - 1; j >= 1; j--) { // 對兩個元素進行交換 if (array[j] < array[j - 1] ) { int temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } }}

對冒泡排序不熟悉的讀者,可以放心地忽略上面代碼的方法體,它不會對你理解泛型造成絲毫的障礙,你只要知道它所實現(xiàn)的功能就可以了:將一個數(shù)組的元素按照從小到大的順序重新排列。我們對這個程序進行一個小小的測試:

class PRogram { static void Main(string[] args) { SortHelper sorter = new SortHelper(); int[] array = { 8, 1, 4, 7, 3 }; sorter.BubbleSort(array); foreach(int i in array){ Console.Write("{0} ", i); } Console.WriteLine(); Console.ReadKey(); }}

輸出為:

1 3 4 7 8

我們發(fā)現(xiàn)它工作良好,欣喜地認為這便是最好的解決方案了。直到不久之后,我們需要對一個byte類型的數(shù)組進行排序,而我們上面的排序算法只能接受一個int類型的數(shù)組,盡管我們知道它們是完全兼容的,因為byte類型是int類型的一個子集,但C#是一個強類型的語言,我們無法在一個接受int數(shù)組類型的地方傳入一個byte數(shù)組。好吧,沒有關(guān)系,現(xiàn)在看來唯一的辦法就是將代碼復制一遍,然后將方法的簽名改一個改了:

public class SortHelper { public void BubbleSort(int[] array) { int length = array.Length; for (int i = 0; i <= length - 2; i++) { for (int j = length - 1; j >= 1; j--) { // 對兩個元素進行交換 if (array[j] < array[j - 1]) { int temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } } public void BubbleSort(byte[] array) { int length = array.Length; for (int i = 0; i <= length - 2; i++) { for (int j = length - 1; j >= 1; j--) { // 對兩個元素進行交換 if (array[j] < array[j - 1]) { int temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } }}

OK,我們再一次解決了問題,盡管總覺得哪里有點別扭,但是這段代碼已經(jīng)能夠工作,按照敏捷軟件開發(fā)的思想,不要過早地進行抽象和應(yīng)對變化,當變化第一次出現(xiàn)時,使用最快的方法解決它,當變化第二次出現(xiàn)時,再進行更好的構(gòu)架和設(shè)計。這樣做的目的是為了避免過度設(shè)計,因為很有可能第二次變化永遠也不會出現(xiàn),而你卻花費了大量的時間精力制造了一個永遠也用不到的“完美設(shè)計”。這很像一個諺語,“fool me once,shame on you. fool me twice, shame on me.”,翻譯過來的意思是“愚弄我一次,是你壞;愚弄我兩次,是我蠢”。

美好的事情總是很難長久,我們很快需要對一個char類型的數(shù)組進行排序,我們當然可以仿照byte類型數(shù)組的作法,繼續(xù)采用復制粘貼大法,然后修改一下方法的簽名。但是很遺憾,我們不想讓它愚弄我們兩次,因為誰也不想證明自己很蠢,所以現(xiàn)在是時候思考一個更佳的解決方案了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿拉善左旗| 营口市| 江山市| 方正县| 高淳县| 阿荣旗| 彰武县| 德安县| 墨脱县| 永修县| 共和县| 寻乌县| 得荣县| 安泽县| 阳东县| 广河县| 临漳县| 顺义区| 开原市| 新闻| 清苑县| 九龙县| 湖北省| 宝坻区| 应城市| 乌审旗| 莱阳市| 开阳县| 新绛县| 土默特右旗| 河津市| 乐亭县| 鄢陵县| 德保县| 枣阳市| 广宗县| 闵行区| 犍为县| 永春县| 马关县| 尼勒克县|