泛型的Where能夠對類型參數作出限定。有以下幾種方式。
·where T : struct 限制類型參數T必須繼承自System.ValueType。
·where T : class 限制類型參數T必須是引用類型,也就是不能繼承自System.ValueType。
·where T : new() 限制類型參數T必須有一個缺省的構造函數
·where T : NameOfClass 限制類型參數T必須繼承自某個類或實現某個接口。
以上這些限定可以組合使用,比如: public class Point<T> where T : class, IComparable, new()
泛型的機制
·機制:
C#泛型代碼在被編譯為IL代碼和無數據時,采用特殊的占位符來表示泛型類型,並用專有的IL指令支持泛型操作。而真正的泛型實例化工作以"on-demand"的方式,發生在JIT編譯時。
·編譯機制:
1. 第一輪編譯時,編譯器只為Stack<T>(棧算法)類型產生“泛型版”的IL代碼與元數據-----並不進行泛型類型的實例化,T在中間只充當占位符
2. JIT編譯時,當JIT編譯器第一次遇到Stack<int>時,將用int替換“泛型版”IL代碼與元數據中的T---進行泛型類型的實例化。CLR為所有類型參數為“引用類型”的泛型類型產生同一份代碼;但如果類型參數為“值類型”,對每一個不同的“值類型”,CLR將為其產生一份獨立的代碼。
泛型的一些問題
·不支持操作符重載。我只知道這麼多了
范型的意義
泛型的意義何在?類型安全和減少裝箱、拆箱並不是泛型的意義,而是泛型帶來的兩個好處而已(或許在.Net泛型中,這是最明顯的好處了)。泛型的意義在於——把類型作為參數,它實現了代碼之間的很好的橫向聯系,我們知道繼承為代碼提供了一種從上往下的縱向聯系,但泛型提供了方便的橫向聯系(從某種程度上說,它和AOP在思想上有相通之處)。在PersonCollection例子中,我們知道Add()方法和Remove()方法的參數類型相同,但我們明確無法告訴我們的程序這一點,泛型提供了一種機制,讓程序知道這些。道理雖然簡單,但這樣的機制或許能給我們的程序帶來一些深遠的變化吧。