C#泛型学习03--使用相应的泛型版本替换ArrayList

一、使用System.Collection.ArrayList对象的简单例子:

View Code
public static void UseNonGenericArrayList()
{
// 创建一个ArrayList.
ArrayList numbers = new ArrayList();
numbers.Add(1); // 导致装箱操作
numbers.Add(2); // 导致装箱操作
// 显示ArrayList内的所有整数
// 每次迭代都导致拆箱操作
foreach (int i in numbers)
{
Console.WriteLine(i);
}
numbers.Clear();
}

二、使用了System.Collections.Generic.List对象的简单例子:

View Code
public static void UseGenericList()
{
// 创建一个List.
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
// 显示List中的所有整数.
foreach (int i in numbers)
{
Console.WriteLine(i);
}
numbers.Clear();
}

因为所有的应用程序几乎都会使用ArrayList,从提升您的应用程序的执行效率开始是一个不错的选择。对于应用程序中简单使用ArrayList的地方来说,这种替代是非常容易的。但有些地方需要注意,例如,泛型List类未实现Icloneable接口而ArrayList实现了它。

 

图1显示了两个类中的等价成员

 图1中的几个ArrayList的成员和泛型List的成员并非一一对应。从属性开始说,只有Capacity,Count和Item属性两个类中都存在。为了弥补List类中的几个缺失的属性,可以把它显式转换为Ilist接口。下面的代码演示了如何使用这些显式转换以获得缺失的属性。

 

List<int> numbers = new List<int>();
Console.WriteLine(((IList)numbers).IsReadOnly);
Console.WriteLine(((IList)numbers).IsFixedSize);
Console.WriteLine(((IList)numbers).IsSynchronized);
Console.WriteLine(((IList)numbers).SyncRoot);

 

注意,由于缺少返回同步版本的泛型List代码和缺少返回固定尺寸的泛型List代码,IsFixedSize和IsSynchronized属性将总是返回false。SyncRoot属性被调用时将总是返回相同的对象,本质上这个属性返回this指针。微软已经决定从所有泛型集合类中去除创建同步成员的功能。做为代替,他们推荐使用lock关键字去锁住整个集合或其他类型的同步对象来满足您的需要。

静态的ArrayList.Repeat在泛型List中没有对应的方法。做为代替,您可以使用下面的泛型方法:

 

View Code
public static void Repeat<T>(List<T> list, T obj, int count)
{
if (count < 0)
{
throw (new ArgumentException(
"参数count 必须大于或等于零"));
}
for (int index = 0; index < count; index++)
{
list.Add(obj);
}
}

这个泛型方法有三个参数:

list 泛型List对象

obj 将被以指定次数添加进泛型List中的对象

count 把obj添加进泛型类中的次数

因为Clone方法也没有出现在泛型List类中(因为这个类并没有实现Icloneable接口),您可以使用泛型List类的GetRange方法做为替代。

List<int> oldList = new List<int>();
// 给oldList添加元素…
List<int> newList = oldList.GetRange(0, oldList.Count);

GetRange方法对List对象中一个范围的元素执行浅拷贝(跟ArrayList中的Clone方法接近)。在此例中这个范围是所有元素。

提示:ArrayList 默认的初始容量是16个元素,而List<T>的默认初始容量为4个元素。这意味着当添加第17个元素时,List<T>不得不 改变尺寸(重新分配内存)3次,而ArrayList只重新分配一次。这一点在评估应用程序性能时需要被考虑。

posted @ 2012-03-01 23:48  chen3jian  阅读(474)  评论(0编辑  收藏  举报