整理一下昨天學習的泛型,有不對的地方歡迎指正: 定義一個類,這個類中某些欄位的類型不確定,這些類型可以在構造類時確定下來 2.泛型方法 泛型方法就是定義一個方法,這個方法的參數類型可以是不確定的,當調用這個方法時再去確定這個方法參數的類型。 T作為類型參數也是一個占位符在泛型中,例: 3.泛型解析: ...
整理一下昨天學習的泛型,有不對的地方歡迎指正:
- 泛型類
定義一個類,這個類中某些欄位的類型不確定,這些類型可以在構造類時確定下來
2.泛型方法
泛型方法就是定義一個方法,這個方法的參數類型可以是不確定的,當調用這個方法時再去確定這個方法參數的類型。
T作為類型參數也是一個占位符在泛型中,例:
3.泛型解析:
在編譯器解析泛型的時候會用占位符去表達有幾個類型參數比如~1是1個類型參數T,~2是兩個類型參數TKey,TValue,在CLR解析運行的時候具體參數類型已經確定,會把占位符替換成具體參數類型
4.泛型與Object:
由其他值類型到object,系統會自動裝箱,拆箱操作,需要操作堆和棧會對系統性能產生影響,若處理引用類型,必須要進行類型強制轉化,也會產生一定的影響,有可能因為類型的強制轉化出現錯誤。
泛型方法效率最高>普通方法>object方法
5.泛型約束:
定義泛型類時,作為對類型參數的幾種類型施加限制,如果嘗試使用約束不允許的類型實例化類,則會產生編譯時錯誤,這些限製成為約束.通過where上下文關鍵字指定約束。
where T:類:基類不是是密封的,密封類不能被繼承,加約束毫無意義
where T:new()(類型參數必須具有無參數的公共構造函數。當與其他約束一起使用時,new() 約束必須最後指定。)
註意:有多個泛型約束時,new()約束一定是在最後,泛型類型不能繼承多個基類可以繼承多個介面。
基類約束:
引用類型約束:
值類型約束:
new()約束:
多個泛型約束:
public static void Show<T>(T tParameter)
where T : People, ISports, IWork, new()
{
}
6.泛型緩存:
類中的靜態類型無論實例化多少次,在記憶體中只會有一個,靜態構造函數只會執行一次,在泛型類中,T類型不同,每個不同的T類型,都會產生一個不同的副本,所以會產生不同的靜態屬性,不同的靜態構造函數
註意:只能為不同的類型緩存一次.泛型緩存比字典緩存效率高。泛型緩存不能主動釋放。