c#中泛型


整理一下昨天學習的泛型,有不對的地方歡迎指正:

  1. 泛型類

定義一個類,這個類中某些字段的類型不確定,這些類型可以在構造類時確定下來

 

 

 

 

 

    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類型,都會產生一個不同的副本,所以會產生不同的靜態屬性,不同的靜態構造函數

注意:只能為不同的類型緩存一次.泛型緩存比字典緩存效率高。泛型緩存不能主動釋放。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM