public class dictionary<keytype, valtype> where keytype : icomparable, keytype : ienumerable, valtype : customer { public void add(keytype key, valtype val) { ... switch(key.compareto(x)) { } ... } } 運(yùn)行時(shí)的泛型 泛型類的編譯方法與常規(guī)類的編譯方法幾乎沒有差別。事實(shí)上,編譯結(jié)果只不過是元數(shù)據(jù)和中間語言 (il)。當(dāng)然,為了接受代碼中用戶提供的類型,應(yīng)對(duì) il 進(jìn)行參數(shù)化。根據(jù)提供的類型參數(shù)是值類型還是引用類型,泛型的 il 的用法會(huì)有所不同。
當(dāng)將值類型作為參數(shù)首次構(gòu)造泛型時(shí),運(yùn)行時(shí)將使用提供的參數(shù)替換 il 中的相應(yīng)位置來創(chuàng)建一個(gè)專用的泛型。針對(duì)每個(gè)用作參數(shù)的唯一值類型,將一次性創(chuàng)建專用的泛型。
stack<int> stackone = new stack<int>(); stack<int> stacktwo = new stack<int>(); 但是,如果在程序代碼中的其他位置又創(chuàng)建了一個(gè) stack 類,并使用不同的值類型(例如長整型或用戶定義的結(jié)構(gòu))作為其參數(shù),則運(yùn)行時(shí)將生成其他形式的泛型,而這時(shí)會(huì)替換 il 相應(yīng)位置中的長整型參數(shù)。為使用值類型構(gòu)造的泛型創(chuàng)建專用類的優(yōu)點(diǎn)是可以獲得更好的性能。畢竟每個(gè)專用的泛型類都是在“本地”包含值類型,因此不必再進(jìn)行轉(zhuǎn)換。
泛型與引用類型的工作方式稍有不同。首次使用任何引用類型構(gòu)造泛型時(shí),運(yùn)行時(shí)用對(duì)象引用替換 il 中的參數(shù)來創(chuàng)建專用的泛型。之后,每當(dāng)使用引用類型作為參數(shù)實(shí)例化構(gòu)造的類型時(shí),無論構(gòu)造的是何種類型,運(yùn)行時(shí)都會(huì)重復(fù)使用先前創(chuàng)建的專用泛型。
例如,假設(shè)有兩個(gè)引用類型,customer 類和 order 類,并進(jìn)一步假設(shè)您創(chuàng)建了 customer 類型的 stack:
public class list { internal object[] elements; internal int count;
public listenumerator getenumerator() { return new listenumerator(this); } } 所創(chuàng)建的 listenumerator 對(duì)象不僅必須實(shí)現(xiàn) current 屬性和 movenext 方法,而且還必須維護(hù)其內(nèi)部狀態(tài),以便程序在每次執(zhí)行該循環(huán)時(shí)都可以移到下一項(xiàng)。此內(nèi)部狀態(tài)機(jī)對(duì)于 list 數(shù)據(jù)結(jié)構(gòu)而言比較簡單,但對(duì)于需要遞歸循環(huán)的數(shù)據(jù)結(jié)構(gòu)(例如二叉樹)來說,該狀態(tài)機(jī)將相當(dāng)復(fù)雜。
list list = new list(); foreach(string s in list) { console.writeline(s); } 如果要讓程序?qū)崿F(xiàn)迭代程序以遍歷列表中的元素,則需要使用 foreach 循環(huán)修改此迭代程序使其遍歷元素?cái)?shù)組,并在每次迭代中產(chǎn)生數(shù)組中的每個(gè)項(xiàng)目:
public class list { internal object[] elements; internal int count;
public object foreach() { foreach(object o in elements) { yield o; } } } 迭代程序的工作原理 迭代程序代表所在的程序處理實(shí)現(xiàn)枚舉器模式的日常操作。c# 編譯器將您在迭代程序中編寫的代碼轉(zhuǎn)換成使用枚舉器模式的相應(yīng)類和代碼,而無需創(chuàng)建類和建立狀態(tài)機(jī)。通過這種方式,迭代程序顯著提高了開發(fā)人員的工作效率。