使用非泛型集合類的限制可以通過編寫一小段程式來演示,該程式利用 .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 中泛型效率對比(ArrayList和List)
泛型一般效率比較高,因為它的操作並不是裝箱拆箱,也不涉及object型別轉換。下面的一段程式主要測試泛型列表list與陣列列表araylist之間的效能對比。這兩種都可以建立列表,且都可以面對不同的資料型別。泛型的資料型別程式設計中指定。arraylist型別為object類,會進行資料的裝箱和拆箱...
Array List和ArrayList的區別與
定義 public abstract class array icloneable,ilist,icollection,ienumerable,istructuralcomparable,istructuraequatable 陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元...
CSS的ul和li實現橫向排列和去掉li的點
今天做網頁是老是不懂怎麼實現ul的橫向排列和去掉li那個煩人的點,現在找到方法了,做個筆記 複製 如下 ul ul li 順便拓展一下li的list style 複製 如下 ul 程式設計客棧 ul ol ol 再寫個今天看到的東西,是關於dl,dt,dd的,其實就是類似於子類的,我比較少見到各個網...