[CLR via C#]12. 泛型 -开发者知识库

[CLR via C#]12. 泛型 -开发者知识库,第1张

  泛型(generic)是CLR和編程語言提供一種特殊機制,它支持另一種形式的代碼重用,即"算法重用"。

  簡單地說,開發人員先定義好一個算法,比如排序、搜索、交換等。但是定義算法的開發人員並不設定該算法要操作什么數據類型;該算法可廣泛地應用於不同類型的對象。然后,另一個開發人員只要指定了算法要操作的具體數據類型,就可以使用這個現成的算法了。

  泛型有兩種表現形式:泛型類型泛型方法

  泛型類型:大多數算法都封裝在一個類型中,CLR允許創建泛型引用類型和泛型值類型,但不允許創建泛型枚舉類型。除此之外,CLR還允許創建泛型接口和泛型委托。

  泛型方法:方法偶爾也封裝有用的算法,所以CLR允許引用類型、值類型或接口中定義泛型方法。

  兩者都是表示API的基本方法(不管是指一個泛型方法還是一個完整的泛型類型),以致平時期望出現一個普通類型的地方出現一個類型參數。比如,List<T>,在類名之后添加一個<T>,表明它操作的是一個未指定的數據類型。定義泛型類型和方法時,它為類型指定的任何變量(比如 T)都稱為類型參數(type parameter)。T代表一個變量名,在源代碼中能夠使用一個數據類型的任何位置 ,都能使用T。

  類型參數是真實類型的占位符。在泛型聲明中,類型參數要放在一堆尖括號內,並以逗號分隔。所以,在Dictionary<TKey, TValue>中,類型參數是TKey和TValue。使用泛型類型或方法時,要使用真實的類型代替。這些真實的類型稱為類型實參(type argument)。

  泛型為開發人員提供了以下優勢:

  1)源代碼保護  使用一個泛型算法的開發人員不需要訪問算法的源代碼。然而,使用C 模板的泛型技術時,算法的源代碼必須提供給准備使用算法的用戶。

  2)類型安全  將一個泛型算法應用於一個具體的類型時,編譯器和CLR能理解開發人員的意圖,並保證只有與制定數據類型兼容的對象才能隨同算法使用。

  3)更清晰的代碼  由於編譯器強制類型安全性,所以減少了源代碼中必須進行的轉型次數。

  4)更佳的性能  在有泛型之前,要想定義一個常規化的算法,它的所有成員都要定義成操作Object數據類型。這其中就要有裝箱和拆箱之間的性能損失。由於現在能創建一個泛型算法來操作一個具體的值類型,所以值類型的實例能以傳值的方式傳遞,CLR不再需要只需任何裝箱操作。由於不再需要轉型,所以CLR不必檢查嘗試一次轉型操作是否類型安全,同樣提高了代碼的允許速度。

一、 Framework類庫中的泛型

  泛型最明顯的應用就是集合類。FCL已經定義了幾個泛型集合類。其中大多數類能在Sysytem.Collections.Generic和System.Collections.ObjectModel命名空間中。要使用線程安全的泛型集合類,可以去System.Collections.Concurrent命名空間尋找。

最佳答案:

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
U19学习网站 » [CLR via C#]12. 泛型 -开发者知识库