2.2.4 类型安全
数组和ArrayList的本质区别在于前者是类型安全的,而后者不是类型安全的。ArrayList为了兼容所有类型的对象,使用了object数组,这给使用带来了一些的麻烦。如下例所示:
【例2-2】数组和ArrayList的对比
本例使用了C#类库中的ArrayList而不是前面自定义的ArrayList,它存在于System.Collections命名空间中。新建一个控制台应用程序,引入System.Collections命名空间,并在Main()方法中输入如下代码:
| using System; using System.Collections; namespace Demo2_2 { class Program { static void Main(string[] args) { int[] arr = new int[2]; arr[0] = 5; arr[1] = 6; int result = arr[0] * arr[1]; Console.WriteLine(result); ArrayList arrL = new ArrayList(); arrL.Add(5); arrL.Add(6); result = (int)arrL[0] * (int)arrL[1]; Console.WriteLine(result); Console.ReadLine(); } } }
30 30 |
其次数组没有添加元素的功能,因为在数组创建时,各个元素就已经存在,只是被初始化为0而已,只能通过下标改变各个元素的值。而ArrayList只有把元素添加进去后才可以通过下标访问相应的元素。
最后,在使用集合中的元素时,数组不需要进行强制类型转换,而ArrayList必须要经过强制类型转换才能使用。这是因为ArrayList实际存放的是object对象,要按照这些对象原本的类型来使用就必须要使用强制类型转换。
ArrayList的这个特点带来了类型安全问题,如:
ArrayList arrL = new ArrayList();
arrL.Add(5);
arrL.Add("Hello World");
arrL.Add(new Button());
以上代码在集合中存放了各种各样的数据类型,但这样做是被允许的。这种类型的不安全一方面给程序带来了隐患,另一方面如果集合中存放的是值类型还会产生装箱和拆箱操作,降低了程序的性能。
.NET 2.0版本的泛型的出现完美地解决了上述问题,新版本使用System.Collections.Generic命名空间下的List<T>类取代了原来的ArrayList类。下面演示了泛型List<T>类的使用:
List<int> arrL=new List<int>();
arrL.Add(1);
arrL.Add(2);
可以看到,第一行代码在集合创建时就已经把元素类型限定为int,它是类型安全的,同时避免了装箱和拆箱操作。强烈建议在实际编程中使用List<T>代替ArrayList。

