在讲之前我们先看一下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");
泛型明确的定义了存储的类型;特别适用于列表项是值类型的情况