泛型及其優點

2021-04-18 11:39:45 字數 3300 閱讀 1074

泛型類和泛型方法同時具備可重用性、型別安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用在集合和在集合上執行的方法中。.net framework 2.0 版類庫提供乙個新的命名空間 system.collections.generic,其中包含幾個新的基於泛型的集合類。建議面向 2.0 版的所有應用程式都使用新的泛型集合類,而不要使用舊的非泛型集合類,如 arraylist。

當然,也可以建立自定義泛型型別和方法,以提供自己的通用解決方案,設計型別安全的高效模式。下面的**示例演示乙個用於演示用途的簡單泛型鏈結列表類。(大多數情況下,建議使用 .net framework 類庫提供的 list類,而不要自行建立類。)在通常使用具體型別來指示列表中所儲存項的型別時,可使用型別引數 t。其使用方法如下:

在 addhead 方法中作為方法引數的型別。

在 node 巢狀類中作為公共方法 getnext 和 data 屬性的返回型別。

在巢狀類中作為私有成員資料的型別。

注意,t 可用於 node 巢狀類。如果使用具體型別例項化 genericlist(例如,作為 genericlist),則所有的 t 都將被替換為int。

public class genericlist

private node next;

public node next

set

}// t as private member data type

private t data;

// t as return type of property

public t data

set }}

private node head;

// constructor

public genericlist()

// t as method parameter type:

public void addhead(t t)

public ienumeratorgetenumerator()

}}

下面的**示例演示客戶端**如何使用泛型 genericlist類來建立整數列表。只需更改型別引數,即可方便地修改下面的**示例,建立字串或任何其他自定義型別的列表:

class testgenericlist

foreach (int i in list)

system.console.writeline("/ndone");

}}

在公共語言執行庫和 c# 語言的早期版本中,通用化是通過在型別與通用基型別 object 之間進行強制轉換來實現的,泛型提供了針對這種限制的解決方案。通過建立泛型類,您可以建立乙個在編譯時型別安全的集合。

使用非泛型集合類的限制可以通過編寫一小段程式來演示,該程式利用 .net framework 基類庫中的 arraylist 集合類。arraylist 是乙個使用起來非常方便的集合類,無需進行修改即可用來儲存任何引用或值型別。

// the .net framework 1.1 way to create a list:

system.collections.arraylist list1 = new system.collections.arraylist();

list1.add(3);

list1.add(105);

system.collections.arraylist list2 = new system.collections.arraylist();

list2.add("it is raining in redmond.");

list2.add("it is snowing in the mountains.");

但這種方便是需要付出代價的。新增到 arraylist 中的任何引用或值型別都將隱式地向上強制轉換為 object。如果項是值型別,則必須在將其新增到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。強制轉換以及裝箱和取消裝箱操作都會降低效能;在必須對大型集合進行迴圈訪問的情況下,裝箱和取消裝箱的影響非常明顯。

另乙個限制是缺少編譯時型別檢查;因為 arraylist 將把所有項都強制轉換為 object,所以在編譯時無法防止客戶端**執行以下操作:

system.collections.arraylist list = new system.collections.arraylist();

// add an integer to the list.

list.add(3);

// add a string to the list. this will compile, but may cause an error later.

list.add("it is raining in redmond.");

int t = 0;

// this causes an invalidcastexception to be returned.

foreach (int x in list)

儘管將字串和 ints 組合在乙個 arraylist 中的做法在建立異類集合時是完全合法的,有時是有意圖的,但這種做法更可能產生程式設計錯誤,並且直到執行時才能檢測到此錯誤。

在 c# 語言的 1.0 和 1.1 版本中,只能通過編寫自己的特定於型別的集合來避免 .net framework 基類庫集合類中的通用**的危險。當然,由於此類不可對多個資料型別重用,因此將喪失通用化的優點,並且您必須對要儲存的每個型別重新編寫該類。

arraylist 和其他相似類真正需要的是:客戶端**基於每個例項指定這些類要使用的具體資料型別的方式。這樣將不再需要向上強制轉換為 t:system.object,同時,也使得編譯器可以進行型別檢查。換句話說,arraylist 需要乙個 type parameter。這正是泛型所能提供的。在 n:system.collections.generic 命名空間的泛型 list集合中,向該集合新增項的操作類似於以下形式:

// the .net framework 2.0 way to create a list

listlist1 = new list();

// no boxing, no casting:

list1.add(3);

// compile-time error:

// list1.add("it is raining in redmond.");

對於客戶端**,與 arraylist 相比,使用 list時新增的唯一語法是宣告和例項化中的型別引數。雖然這稍微增加了些編碼的複雜性,但好處是您可以建立乙個比 arraylist 更安全並且速度更快的列表,特別適用於列表項是值型別的情況

c 泛型優點

泛型主要有以下幾個優點 1.效能高 定義資料型別,不需要型別轉換,避免拆裝箱帶來的效能損失 2.型別安全 定義允許使用的資料型別,在編譯時檢查型別錯誤,及早發現錯誤。裝箱與拆箱的效率問題 arraylist arraylist new arraylist stopwatch watch new st...

泛型的優點

c 中存在泛型,那泛型的優點有哪些?促進了型別安全。確保在引數化的類中,只有成員明確希望的資料leix型別才可使用。編譯時型別檢查jian減少了在執行時發生invalidcastexception異常的機率 為泛型類成員使用值型別,不再造成到object的裝箱轉換。緩解了 膨脹。保持了具體類版本的優...

泛型的優點

object arraylist c the net framework 1.1 way to create a list newnew arraylistobject。如果項是值型別,則必須在將其新增到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。強制轉換以及裝箱和取消裝箱操作都會降低效能 在必...