数组、List和ArrayList的区分
数组在内存中是一连存储的,所以它的索引速率是异常的快,而且赋值与修正元素也很简朴,比方:
string[] s=new string[3]; //赋值 s[0]="a"; s[1]="b"; s[2]="c"; //修正 s[1]="b1";
然则数组也存在一些不足的处所。比方在数组的两个数据间插进去数据也是很贫苦的,另有我们在声明数组的时刻,必需同时指明数组的长度,数组的长度太长,会形成内存糟蹋,数组和长度太短,会形成数据溢出的毛病。如许假如在声明数组时我们并不清晰数组的长度,就变的很贫苦了。C#中最先供应了ArrayList对象来战胜这些瑕玷。
ArrayList是.Net Framework供应的用于数据存储和检索的专用类,它是定名空间System.Collections下的一部分。它的大小是根据个中存储的数据来动态扩大与压缩的。所以,我们在声明ArrayList对象时并不须要指定它的长度。ArrayList继续了IList接口,所以它能够很轻易的举行数据的增添,插进去和移除.比方:
ArrayList list = new ArrayList(); //新增数据 list.Add("abc"); list.Add(123); //修正数据 list[2] = 345; //移除数据 list.RemoveAt(0); //插进去数据 list.Insert(0, "hello world");
从上面示例看,ArrayList好像是处置惩罚了数组中一切的瑕玷,那末它应当就是圆满的了,为何在C#2.0后又会涌现List呢?
在list中,我们不仅插进去了字符串"abc",而且又插进去了数字123。如许在ArrayList中插进去差别范例的数据是许可的。由于ArrayList会把一切插进去个中的数据都当作为object范例来处置惩罚。如许,在我们运用ArrayList中的数据来处置惩罚问题的时刻,极能够会报范例不婚配的毛病,也就是说ArrayList不是范例平安的。既使我们保证在插进去数据的时刻都很警惕,都有插进去了统一范例的数据,但在运用的时刻,我们也须要将它们转化为对应的原范例来处置惩罚。这就存在了装箱与拆箱的操纵,会带来很大的机能消耗。
装箱与拆箱的观点: 简朴的来说: 装箱:就是将值范例的数据打包到援用范例的实例中 比方将int范例的值123赋给object对象o
int i=123; object o=(object)i;
拆箱:就是从援用数据中提取值范例 比方将object对象o的值赋给int范例的变量i
object o=123; int i=(int)o;
装箱与拆箱的历程是很消耗机能的。
恰是由于ArrayList存在不平安范例与装箱拆箱的瑕玷,所以在C#2.0后涌现了泛型的观点。而List类是ArrayList类的泛型等效类。它的大部分用法都与ArrayList类似,由于List类也继续了IList接口。最症结的区分在于,在声明List集应时,我们同时须要为其声明List鸠合内数据的对象范例。 比方:
List<int> list = new List<int>(); //新增数据 list.Add(123); //修正数据 list[0] = 345; //移除数据 list.RemoveAt(0);
上例中,假如我们往List鸠合中插进去string字符"hello world",IDE就会报错,且不能经由过程编译。如许就避免了前面讲的范例平安问题与装箱拆箱的机能问题了。
同时 List不能被组织,但能够向上面那样为List建立一个援用,而ListArray就能够被组织。
List list; //准确 list=null; List list=new List(); // 是毛病的用法
List list = new ArrayList();这句建立了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有然则List没有的属性和要领,它就不能再用了。 而ArrayList list=new ArrayList();建立一对象则保留了ArrayList的一切属性。
List泛型的优点:
经由过程许可指定泛型类或要领操纵的特定范例,泛型功能将范例平安的使命从您转移给了编译器。不须要编写代码来检测数据范例是不是准确,由于会在编译时强迫运用准确的数据范例。减少了范例强迫转换的须要和运行时毛病的能够性。泛型供应了范例平安但没有增添多个完成的开支。
本文来自 C#.Net教程 栏目,迎接进修!
以上就是深切相识数组、List和ArrayList的区分的细致内容,更多请关注ki4网别的相干文章!