C# 之 泛型集合

来源:互联网 发布:linux 挂载硬盘方式 编辑:程序博客网 时间:2024/04/30 05:42
    上一篇博客《C# 之 集合ArrayList》我们讲述了ArrayList的用法和优点,今天我们就来讲讲ArrayList的缺点:

    ArrayList不管你是什么对象都是接受的,因为在它眼里所有元素都是Object,这就是得如果你'arrayAnimal.Add(123);''arrayAnimal.Add("HelloWorld");'在编译时都是没有问题的,但在执行时,'foreach (Animal item in arrayAnimal)'需要明确集合中的元素是Animal类型,而123是整数,HelloWorld是字符串型,这就会在运行到此处时报错,显然,这是典型的类型不匹配错误,换句话说,ArrayList不是类型安全的。



            //用集合的方法实现            Console.WriteLine("Create an ArrayList type collection of Animal objects and use it;");            ArrayList animalArrayList = new ArrayList();            Cow myCow2 = new Cow("HayLey");            animalArrayList.Add(myCow2);            animalArrayList.Add(new Chicken("Roy"));            animalArrayList.Add(123);       //编译没有问题,运行时会报错            foreach (Animal myAnimal in animalArrayList)            {                Console.WriteLine("New {0} object added to ArrayList collection,Name={1}", myAnimal.ToString(), myAnimal.Name);            }            Console.WriteLine("ArrayList collection contains {0} objects.", animalArrayList.Count);            ((Animal)animalArrayList[0]).Feed();            ((Chicken)animalArrayList[1]).LayEgg();            Console.WriteLine();



            Console.WriteLine("Create an ArrayList type collection of Animal objects and use it;");            IList<Animal> animalCollection;            animalCollection = new List<Animal>();            animalCollection.Add(new Cow("Jack"));            animalCollection.Add(new Chicken("Vera"));            foreach (Animal myAnimal in animalCollection)            {                Console.WriteLine("New {0} object added to ArrayList collection,Name={1}", myAnimal.ToString(), myAnimal.Name);            }            Console.WriteLine("ArrayList collection contains {0} objects.", animalCollection.Count);            ((Animal)animalCollection[0]).Feed();            ((Chicken)animalCollection[1]).LayEgg();            Console.WriteLine();



    还有就是ArrayList对于存放值类型数据,比如int、string型(string是一种拥有值类型特点的特殊引用类型)或者结构struct的数据,用ArrayList就意味着都需要将值类型装箱为Object对象,使用集合元素时,还需要执行拆箱操作。相对于简单的赋值而言,装箱和拆箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象。其次,拆箱所需的强制转换也需要进行大量的计算。总之,装箱拆箱是耗资源和时间的。而ArrayList集合在使用值类型数据时,其实就是在不断地做装箱和拆箱的工作,这显然是非常糟糕的事情。为了解决这个问题,我们就需要学习下面的内容:泛型。


    泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、接口、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。

    泛型是2.0版C#语言和公共语言运行库(CLR)中的一个新功能。泛型将类型参数的概念引入.NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数T,你可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。

下面主要给大家讲一下泛型集合类型

    首先泛型集合需要System.Collections.Generic的命名空间。而List类是ArrayList类的泛型等效类。该类使用大小可按需动态增加的数组实现IList泛型接口。其实用法上关键就是在IList和List后面加'<T>',这个'T'就是你需要制定的集合的数据或对象类型。


    其实List和ArrayList在功能上时一样的,不同就在于,它在声明和实例化时都需要制定其内部项的数据或对象类型,这样就能避免类型安全问题和装箱拆箱的性能问题。


    通常情况下,都建议使用泛型集合,因为这样可以获得类型安全的直接有点而不需要从基集合类型派生并实现类型特定的成员。此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱。







13 0
原创粉丝点击