当前位置:编程学习 > C#/ASP.NET >>

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只重新分配一次。这一点在评估应用程序性能时需要被考虑。

 

摘自 chen3jian
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,