第12章 泛型

2022-09-02 10:06:12 字數 1401 閱讀 6269

泛型(generic)是clr和程式語言提供的一種特殊機制,它支援另一種形式的**重用,即演算法重用。

簡單的說,開發人員先定義好乙個演算法,比如排序、搜尋、交換、比較或者轉換等。但是,定義演算法的開發人員並不設定該演算法要操作什麼資料型別。該演算法可以廣泛地應用於不同型別的物件。然後,另乙個開發人員,只有指定了演算法要操作的具體資料型別,就可以開始使用這個現成的演算法了。例如,可以用乙個排序演算法來操作int32和string等型別物件。

大多數演算法都封裝在乙個型別中,clr允許建立泛型引用型別和泛型值型別,但不允許建立泛型列舉型別。clr還允許建立泛型介面和泛型委託。

先來看乙個簡單的例子,framework類庫中定義了乙個泛型列表演算法,它知道如何管理乙個物件集合。泛型演算法沒有設定這些物件的資料型別。

封裝了泛型列表演算法的fcl類稱為list。泛型list類的設計者緊接著在這個類名後新增乙個,表明它操作的是乙個未指定的資料型別。

定義泛型型別時,它為型別指定的任何變數(比如t)都稱為型別引數(type parameter)。t是乙個變數名,在源**中能夠使用乙個資料型別的任何位置,都能使用t。

列如:在list類定義中,

t被用作方法引數,add方法接收乙個t型別的引數public void add(t item);

t被用作返回值,toarray方法返回一組t型別的一維陣列public t toarray();

根據microsoft的設計原則,泛型引數變數要麼稱為t,要麼至少以大寫t開頭(如tkey和tvalue)。

使用泛型型別或方法時,指定的具體資料型別稱為型別實參(type argument)。

例如:開發人員可指定乙個datetime型別實參來使用list演算法。

public class program{

private static void somemethod()

//構造乙個list來操作datetime物件

listdtlist = new list();

//向列表新增datetime物件,不進行裝箱

dtlist.add(datetime.now);

dtlist.add(datetime.minvalue);

//嘗試向列表中新增乙個string物件,編譯時報錯,invalid arguments

dtlist.add("1/1/2004");

//從列表提取乙個datetime物件

datetime dt = dtlist[0];

從以上**可以看出,泛型為開發人員提供了以下優勢:

泛型最明顯的應用就是集合類。

fcl定義的幾個泛型集合類,大多數都在system.collections.generic和system.collections.objectmodel命名空間中。

泛型是在clr2.0版本中加入的,為了在clr中加入泛型,microsoft做了一下工作:

第12章 泛型

泛型字母 形式型別引數 formal type parameters 即泛型字母 命名 泛型字母可以隨意指定,盡量使用單個的大寫字母 有時候多個泛型型別時會加上數字,比如t1,t2 常見字母 見名知意 t type k v key value e element 需求 定義學生類,其中有學生成績 整...

第12章 泛型

publicstaticvoidmain string args 1 泛型沒有多型 如果b是a的乙個子型別 子類或者子介面 而g是具有泛型宣告的類或介面,g並不是g的子型別!比如 string是object的子類,但是list並不是list的子類。2 沒有泛型陣列 public class test...

第9章 泛型

增加了泛型支援後的集合,完全可以記住集合中元素的型別,並可以在編譯時檢查集合中元素的型別,如果試圖向集合中新增不滿足型別要求的物件,編譯器就會提示錯誤。建立的方法是 在集合介面 類後增加尖括號,尖括號裡放乙個資料型別,如 liststr new arraylist 對於後面的 系統會自動識別為str...