理解C 泛型

2022-03-07 22:53:11 字數 2838 閱讀 8111

在c# 2.0中引入了泛型,泛型的出現解決了編碼中的很多問題。相信大家一定經常用到"system.collections.generic"命名空間中的泛型集合類("generic"就是泛型的意思)。在c# 1.0中,我們還在使用"system.collections"命名空間中的非泛型集合類,那麼看看我們在沒有泛型的時候遇到的問題。

問題1:強制型別轉換

arraylist stulist = new

arraylist();

student wilber = new student ;

stulist.add(wilber);

student stu = (student)stulist[0

];stulist.add(

10);

在使用非泛型集合arraylist時,所有的物件都是以object型別加入arraylist,當物件從arraylist取出的時候也是object型別,這時我們就需要進行強制型別轉換,如果轉換不當,就會得到乙個執行時的錯誤;即使我們向arraylist新增不同型別的物件時,也不會報錯(例如上面向stulist中加入了乙個int值)。

問題2:裝箱和拆箱

在上面的例子中,如果我們使用arraylist存放一組值型別的資料(例如一組int值),存入時,每個值型別的資料都要進行裝箱為object型別;取出時,每個object型別的資料又要進行拆箱操作。

可以看到,在使用非泛型集合的時候,使用者需要自己進行型別轉換,並且可能遇到執行時的型別轉換異常;同時,對於值型別的操作 ,非泛型集合會有裝箱和拆箱帶來的效率問題。

對於上面的問題,我們可以使用c# 2.0中的泛型集合。

這樣一來,我們就通過型別引數(例子中的student)來限制list可以包含的例項型別,從而避免的強制型別轉換。

同時,通過型別引數,編譯器可以進行型別檢查,當試圖往list中存入乙個與型別引數不匹配的物件的時候,編譯器就是給出錯誤提示。

下面我們看看泛型中的一些概念和術語。

泛型有兩種表現形式:泛型型別(包括類、介面、委託和結構,沒有泛型列舉)和泛型方法。在泛型型別和泛型方法中都會有型別引數,當通過泛型型別例項化物件或者對泛型方法呼叫的時候,都需要使用乙個真實的型別來代替型別引數。

型別引數是真實型別的佔位符,在泛型宣告過程中,所有的型別引數放在一對間括號中(<>),通過逗號分隔。

根據型別引數不同的指定型別實參的情況,泛型型別可以分為:

型別是物件的藍圖,我們可以通過型別來例項化物件;那麼對於泛型來說,未繫結泛型型別是以構造泛型型別的藍圖,已構造泛型型別又是實際物件的藍圖。

下圖就是乙個簡單的例子,dictionary就是乙個泛型型別(未繫結泛型型別,開放型別);通過制定型別引數,可以得到不同的封閉型別;通過不同的封閉型別有可以構造不同的例項。

我們都已經習慣了方法的引數和返回值擁有固定的型別,這裡就看看「引數化」的方法。對於泛型方法,可以理解為擁有型別引數的方法。

對於上面例子中dictionary這個泛型型別,有很多方法可以使用,例如:

注意,這些方法中沒有乙個是真正的泛型方法,他們只是使用了泛型型別的型別引數

真正的泛型方法應該擁有自己的型別引數,當我們使用泛型方法的時候,要給泛型方法的類新引數指定型別實參,接下來看乙個泛型方法的例子。

class

program

", getbiggerone(3,9

)); console.writeline(

"the bigger one is

", getbiggerone("

hello

", "

world

"));

console.read();

}public

static t getbiggerone(t itemone, t itemtwo) where

t : icomparable

return

itemtwo;}}

在上面的例子中,我們使用泛型方法來實現乙個兩個元素比較的例子,我們看到方法"getbiggerone"擁有自己的型別引數,當我們看到乙個泛型方法時,可以一步步用真實的型別替換泛型方法中的型別引數,這樣就會簡化我們的分析。

對於泛型的型別約束,將在下面一篇文章介紹。

根據上面的分析,可以看到泛型有一些的優點:

型別安全

效率泛型的出現,給我們帶來了很多好處,泛型實現了型別和方法的"引數化"。

基於泛型,我們可以實現**重用,並且泛型為我們提供了型別安全檢查。對於值型別的操作,通過泛型可以避免裝箱和拆箱帶來的效能損失。

同樣c# 2.0 以後,就建議只在**中使用支援泛型的集合類了(system.collections.generic)。

徹底理解C 泛型委託

不多說,先上 class program string addstring string s1,string s2 static void main string args intdel 100 200 mygenericdelegate string stringdel stringdel p.a...

C 泛型的簡單理解

泛型和繼承是提高程式可重用性的兩 寶。泛型的主要思想就是將演算法從資料結構中抽象出來,使得預定義的操作能夠作用於不同的資料型別,從而簡化整個程式設計模型。泛型 generic 是具有佔位符 型別引數 的類 結構 介面和方法,它與普通類的區別是多了乙個或多個表示類的佔位符,這些佔位符用尖括號括起來。從...

C 泛型 理解與分析

在這篇文章中,我們將會討論如何在c 中用示例實現泛型。在這篇文章 中,我們將會討論以下幾個觀點 1 為什麼需要泛型?2 泛型是什麼?3 泛型的優勢或者說優點 4 如何實現泛型?5 如何使用泛型?一 為什麼需要泛型?我們用示例來說明一下為什麼需要泛型。我們建立乙個簡單的專案來檢查一下兩個整數是否相等。...