在講之前我們先看一下ArrayList的應用:
ArrayList 是一個使用起來非常方便的集合類,無需進行修改即可用來存儲任何引用或值類型。 如:
ArrayList list1 = new ArrayList();
list1.Add(1);
list1.Add(2);
ArrayList list2 = new ArrayList();
list2.Add("1");
list2.Add("2");
問題1:
這種方便是需要付出代價的。添加到 ArrayList 中的任何引用或值類型都將隱式地向上強制轉換爲 Object。如果項是值類型,則必須在將其添加到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。強制轉換以及裝箱和取消裝箱操作都會降低性能;在必須對大型集合進行循環訪問的情況下,裝箱和取消裝箱的影響非常明顯。
問題2:
另一個限制是缺少編譯時類型檢查;因爲 ArrayList 將把所有項都強制轉換爲 Object,所以在編譯時無法防止客戶端代碼執行以下操作:
ArrayList list1 = new ArrayList();
list1.Add(1);
list1.Add("hehe");
int result = 0;
for (int i = 0; i < list1.Count; i++)
{
result +=int.Parse(list1[i].ToString());
}
儘管將字符串和 int組合在一個 ArrayList 中的做法在創建異類集合時是完全合法的,有時是有意圖的,但這種做法更可能產生編程錯誤,並且直到運行時才能檢測到此錯誤。
解決方法:
而泛型很好的解決了這兩個問題;:
List<int> listInt = new List<int>();
listInt.Add(1);
listInt.Add(2);
List<string> listStr = new List<string>();
listStr.Add("str1");
listStr.Add("str2");
泛型明確的定義了存儲的類型;特別適用於列表項是值類型的情況