在應用程序中存儲數據最簡單的容器是數組,但無法滿足數據的動態伸縮,為了擺脫這些數組的限制,.net基礎類庫發布了很多包含集合類的命名空間,集合類的尺寸是動態的,可以在運行時插入或者移除數據項,集合類包括兩類:
1.非泛型集合:
主要位於System.Collections命名空間,包括ArraryList,BitArray,Stack,Queue等類,同時System.Collections.Specialized下的ListDictionary等類以及一些接口。
非泛型集合存在的問題:
1)性能問題:.Net支持兩大數據類型:值類型和引用類型,有時候需要用某個類別的變量表示另外一個類別的變量,c#提供了裝箱的機制將值類型的數據保存在引用類型中,裝箱的實際定義為CLR會在堆上分配新的對象,將值類型的值賦予新的實例,並返回新的對象的引用。相反的操作為拆箱,拆箱是將保存在對象引用上的值轉換回棧上相應的值類型,CLR會驗證收到的值類型是否是裝箱的值類型,如果是就將值賦值回本地值類型,如果不是則拋出異常。盡管裝箱和拆箱都很方便,但帶來的棧/堆內存的轉移會導致性能問題。
2)類型安全問題
除了拆箱的時候我們需要記住裝箱的值類型,還需要類型安全的容器來操作某些特定的數據類型,在引入泛型之前,需要通過手工創建強類型的集合類。
2.泛型集合
使用泛型集合可以解決上面的問題,包括性能的損失,泛型更類型安全,以及無需手工創建強類型的集合類,只需使用泛型集合並制定類型。
1)在創建泛型結構的時候需要在聲明變量或者調用構造函數的時候指定類型參數,此時所有的占位符都將替換為類型參數。
2)非泛型類或者結構都支持泛型成員,在調用這種方法時需要指定類型參數,例如System.Array的sort靜態方法包含一個相應的泛型方法sort<T>().
3)List<T>是泛型類中最常用的,可以動態的調整數據,以下舉例說明具體的實現:
4)stack<T>類以后進先出的方式維護數據的集合,包含pop()和push(),從棧內壓入或移除數據
5)Quenue<T>,隊列以先進先出的方式訪問數據,使用Enqueue()和Dequeue()添加數據和移除數據
6)SortedSet<T>類,這個類中的數據是排序的,在插入和移除數據之后仍然能自動排序,需要向其構造函數中傳遞一個實現了IComparer<T>,該接口定義了Compare方法。
7)ObservableCollection<T>類表示能在添加、移除或者刷新整個列表時提供通知的動態數據集,合,ReadOnlyObservableCollection<T>的操作與之類似,不過是只讀的。ObservableCollection《T>實現了一個名為CollectionChanged事件,該事件在插入新的數據或者移除數據時觸發。
8)除了使用命名空間內包含的泛型類型后,也可以自定義泛型方法,以下定義了一個交換的泛型方法。
9)除了自定義泛型方法外,還可以自定義泛型結構和泛型類
10).net平台可以通過where關鍵字約束參數的類型
.NET支持的類型參數約束有以下五種:
where T : struct | T必須是一個結構類型
where T : class | T必須是一個Class類型
where T : new() | T必須要有一個無參構造函數
where T : NameOfBaseClass | T必須繼承名為NameOfBaseClass的類
where T : NameOfInterface | T必須實現名為NameOfInterface的接口