來源:http://www.survivalescaperooms.com/JimmyZhang/archive/2008/12/17/1356727.html
.Net 1.1版本最受詬病的一個缺陷就是沒有提供對泛型的支持。通過使用泛型,我們可以極大地提高代碼的重用度,同時還可以獲得強類型的支持,避免了隱式的裝箱、拆箱,在一定程度上提升了應(yīng)用程序的性能。本文將系統(tǒng)地為大家討論泛型,我們先從理解泛型開始。
我想不論大家通過什么方式進入了計算機程序設(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)在是時候思考一個更佳的解決方案了。
新聞熱點
疑難解答