泛型與非泛型的區別及詳細解釋

2021-10-02 09:37:29 字數 3153 閱讀 5001

1:簡介

我們都知道陣列是一組具有相同資料型別的資料的集合,在程式中可以儲存資料,但是陣列有乙個缺點,即當其中的元素初始化後,要在程式中動態的給陣列新增,或刪除某個元素是很困難的。那麼如何解決這個問題?.net給我們提供了各種集合物件,如arraylist和hashtable。它們都可以很好的進行元素的動態新增,刪除等操作。此外還要介紹c#中的乙個重要概念——泛型。

2:arraylist

1:arraylist非常類似於陣列,也有人稱它為陣列列表,arraylist是乙個可動態維護的集合。陣列的容量是固定的,而arraylist的容量是可以根據需要自動擴充,它的索引會根據程式的擴充套件而重新進行分配和調整。arraylist提供了一系列的方法對其中的元素,進行訪問增加,刪除的操作。

2:和陣列類似,arraylist中儲存的資料稱為元素;arraylist可以儲存的元素就是arraylist的容量,其預設初始容量為0;可以通過索引訪問arraylist中的元素,索引從0開始。

3:arraylist類屬於system.collections命名空間,這個命名空間包含介面和類,這些介面和類定義各種物件(如列表,佇列,位陣列,雜湊表和字典)的集合,arraylist就屬於集合中的一種,因此在使用arraylist類之前一定要引入system.collection命名空間。

4:需要注意的是,arraylist是動態可維護的,因此定義時既可以指定容量,又可以不指定容量。

5:arraylist的常用屬性及方法

6:arraylist通過add()方法新增元素,該方法說明如下

返回值:值是乙個int整型,用於返回所新增的元素的索引。

引數:如果向arraylist中新增的元素是值型別,這些元素就會裝箱處理轉換為object引用型別,然後儲存。因此arraylist中所有元素都是物件的引用。

3:hashtable

1:在arraylist集合中我們使用索引訪問它的元素,但是使用這種方式必須了解集合中某個資料的位置。當arraylist中的元素變化頻繁時,要跟蹤某個元素的下標就比較困難了。那麼能不能給集合中的每個元素分別起乙個有意義的關鍵字,然後通過關鍵字來訪問其中的元素呢?

2:c#為我們提供了一種稱為hashtable的資料結構,通常稱為雜湊表,也有人稱為「字典」。使用字典這個名稱是因為其資料構成非常類似於現實生活中的字典。在一本字典中我們通過乙個單詞查詢關於這個單詞的更多資訊。hashtable的資料是通過鍵(key)和值(value)來組織的。hashtable也屬於system.collection命名空間,它的每個元素都是乙個鍵/值對。

3:hashtable的常用方法及屬性

//遍歷key

foreach

(object obj in enineers.keys)

//遍歷value

foreach

(object obj in enineers.values)

//遍歷hashtable還可以採用下面的方式。

foreach

(dictionaryentry en in enineers.keys)

dictionaryentry是乙個結構,定義可設定或者檢索的hashtable的鍵/值對。

4:泛型

泛型是c#2.0中的乙個新特性。泛型引入了乙個概念,型別引數,通過型別引數(t),減少了執行時強制轉換或裝箱操作的風險,通過泛型可以最大限度的重用**,保護型別的安全及提高效能,他最常見的應用就是建立集合類,可以約束集合類中的元素的型別。比較典型的泛型集合是list和dictionary。下面對這兩種泛型進行詳細說明。

5:泛型集合list

1:在system.collections.generic命名空間中定義了許多泛型集合類,這些類可以替代我們前邊學習的arraylist和hashtable。

2:語法:list 物件名 = new list();

「」中的t可以對集合中的元素型別進行約束,t表明集合中管理的元素型別,對集合中的資料型別進行約束。

3:list和arraylist的區別:

6:泛型集合dictionary

1:在c#中還有一種泛型集合dictionary,它具有泛型的全部特性,編譯時檢查型別約束,獲取元素時無需型別轉換,並且它儲存資料的方式和hashtable類似,也是通過key/value(鍵/值)對元素儲存的。

2:語法:dictionary物件名 = new dictionary();

說明:dictionary中表示集合中key的型別,v表示value的型別,它們的含義和list是相同的。

3:dictionary和hashtable的區別:

foreach

(keyvaluepair<

string

,se> en in engineers)

keyvaluepaiy是乙個泛型結構,定義可設定或者檢索的鍵/值對。

7:泛型類

1:對於一些常常處理不同型別資料轉換的類,可以使用泛型定義。定義泛型類的過程,與定義乙個類相似,不同之處尖括號中定義了型別引數。

2:語法:

public

class 類名

t指型別引數,代表具體的資料型別,可以是類型別,也可以是基本資料型別。

8:泛型有以下優點:

1:效能高,普通集合的資料需要裝箱,拆箱操作,而泛型無需型別轉換的操作。

2:型別安全。泛型集合對它所儲存的物件進行了型別約束,不是它所允許儲存的型別是無法新增到泛型集合中的。

3:實現**的重用。泛型相當於模板,由於它支援任意的資料型別,開發人員不必為每種特定的資料型別編寫一套方法,所以它具有極大的可重用性。泛型程式設計是未來的主流技術=之一。

泛型和非泛型

原帖 泛型和非泛型 一 區別 1 非泛型類容器來說,該容器的元素型別是 object 使用方便,無須指定具體的元素型別。但是這種使用上的方便帶來了慘重的效能上的損失,因為,我們每次插入乙個元素就要經過一次 裝箱 操作,每次訪問乙個元素就要經過一次 拆箱 操作。arraylist hashtable ...

泛型與非泛型集合類的區別及使用例程

非泛型集合類 泛型集合類 描述arraylist list 表示具有動態大小的物件陣列 hashtable dictionary 由鍵值對組成的集合 sortedlist sortedlist 和字典相似但有排序功能的集合 queue queue 表示標準的先進先出 fifo 佇列 stack st...

泛型List與非泛型ArrayList

arraylist集合的用處越來越窄了,list static void main string args arraylist的不安全性一目了然,型別不安全,必將導致各種攻擊的產生,static void main string args 相比不安全的arraylist來說,list 的型別安全性使...