C 泛型介紹

2021-08-02 03:48:50 字數 2026 閱讀 1087

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

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

c#複製

// 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.");

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

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

c#複製

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組合在乙個 中的做法在建立異類集合時是完全可接受的,並且有時需要有意為之,但這種做法很可能產生程式設計錯誤,並且直到執行時才能檢測到此錯誤。

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

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

c#複製

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

list list1 = new list();

// no boxing, no casting:

list1.add(3);

// compile-time error:

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

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

泛型介紹(C 程式設計)

泛型類和泛型方法同時具備可重用性 型別安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用與集合以及作用於集合的方法一起使用。net framework 2.0 版類庫提供乙個新的命名空間 system.collections.generic,其中包含幾個新的基於泛型的集合類。建議面向 net...

C 2 0泛型介紹之簡單泛型類。

下面是乙個簡單的泛型類。public class genericclass f,t public genericclass f name,t age public f name set public t age set 這是乙個最簡單的泛型類了。f,t就是就是型別引數。可以是乙個物件,也可以是某種資...

泛型簡單介紹

泛型的優勢 1 效能 泛型的使用可以避免由於值型別和引用型別轉換時候所發生的裝箱和拆箱問題 常用arrarylist使用方法,在object和int型別裝換過程中存在裝箱和拆箱過程 arrarylist array new arraylist list.add 12 裝箱 int h int lis...