关于泛型 vs 非泛型
MSDN话:泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用在集合和在集合上运行的方法中。.NET Framework 2.0 版类库提供一个新的命名空间 System.Collections.Generic,其中包含几个新的基于泛型的集合类。建议面向 2.0 版的所有应用程序都使用新的泛型集合类,而不要使用旧的非泛型集合类,如 ArrayList。
非泛型集合-System.Collections名字空间中的类主要包括ArrayList, Hashtable,Queue,SortedList,Stack等,而泛型集合-System.Collections.Generic中常用的包括List<T>,LinkedList<T>,Queue<T>,Stack<T>。这些都是非常常见的数据结构。
下面看泛型 与 非泛型之间的比较:
一、性能问题
下面以ArrayList与List<T>为例说明泛型集合的优点及非泛型集合的缺点。(可以通过Visual Studio的object browser浏览这两个类的方法,属性等)。例如,有这么一段代码:
ArrayList numbers = new ArrayList();
numbers.Add(11);
numbers.Add(111);
int number =(int) numbers[1];
Console.WriteLine(number);
这段代码的背后会发生什么呢?首先,ArrayList中将所有元素都看成Object类型的,是引用类型。第一行声明一个ArrayList的对象,第二,三行调用Add方法增加两个整数。在这个过程中,整数22,35被CLR装箱(boxing)成object类型的,而在第四行访问第二个元素时又被拆箱(unboxing),装箱与拆箱大体上会发生以下过程
1. 在托管堆中非配一个新的object
2. 基于栈(stack-based)的数据必须移动到刚非配的内存区中
3. 当拆箱时,位于堆中的数据又得移动到栈中
4. 堆中无用的数据进行垃圾回收
当涉及大量装箱与拆箱操作时,必然会影响应用程序的性能。而是用泛型的集合类时,比如用
List<int> numbers = new List<int>();代替上述第一行,第四行相应改成
int number = numbers[1];减少了装箱与拆箱的工作,当存在大量数据时,自然可以提高很多性能。
二、类型安全问题
对于ArrayList,下面的代码编译时时不会报错的。
ArrayList numbers = new ArrayList();
numbers.Add(22);
numbers.Add(35.5);
numbers.Add(true);
for (int i = 0; i < numbers.Count; i++)
{
Console.WriteLine((int)numbers[i]);
}
因为可以将int类型,float等数值类型装箱成object,因此即使ArrayList增加的数据类型不一致。编译器也不会提示错误,但是运行时,会报错。
但是如果是用泛型类型比如List<T>,那么在编译时就会进行类型检查。防止运行时错误。
三、代码的优雅与重用
如:List<T> 可以实例化为
List<String> list = new List<String>();
List<int> list = new List<int>();
List<byte> list = new List<byte>();
可以使用任何类型。
这就是泛型的奇妙之处,使类不拘泥于特定的类型,实现代码的优雅与重用。
posted on 2011-10-19 15:06 congplayer 阅读(504) 评论(0) 编辑 收藏 举报