C#之Array、ArrayList与List

2020-08-30  本文已影响0人  莫忘初心_倒霉熊

Array

Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义。Array 类提供了各种用于数组的属性和方法。
属性如: IsReadOnly数组只读。Length数组长度。
方法常用的如下:

  1. Clear
    根据元素的类型,设置数组中某个范围的元素为零、为 false 或者为 null。
  2. Copy(Array, Array, Int32)
    从数组的第一个元素开始复制某个范围的元素到另一个数组的第一个元素位置。长度由一个 32 位整数指定。
  3. CopyTo(Array, Int32)
    从当前的一维数组中复制所有的元素到一个指定的一维数组的指定索引位置。索引由一个 32 位整数指定。
  4. GetLength
    获取一个 32 位整数,该值表示指定维度的数组中的元素总数。
  5. GetType
    获取当前实例的类型。从对象(Object)继承。
  6. GetValue(Int32)
    获取一维数组中指定位置的值。索引由一个 32 位整数指定。
  7. IndexOf(Array, Object)
    搜索指定的对象,返回整个一维数组中第一次出现的索引。
  8. Reverse(Array)
    逆转整个一维数组中元素的顺序。
  9. SetValue(Object, Int32)
    给一维数组中指定位置的元素设置值。索引由一个 32 位整数指定。
  10. Sort(Array)
    使用数组的每个元素的 IComparable 实现来排序整个一维数组中的元素。
  11. ToString
    返回一个表示当前对象的字符串。从对象(Object)继承。

使用方法如:

int[] nums = {1,2,3,4,5 };
Array.Sort(nums);

在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单,比如:nums[2]=5。

但是数组也存在一些不足的地方。比如在数组的两个数据间插入数据也是很麻烦的,还有我们在声明数组的时候,必须同时指明数组的长度,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。这样如果在声明数组时我们并不清楚数组的长度,就变的很麻烦了。C#中最先提供了ArrayList对象来克服这些缺点。

ArrayList

ArrayList动态数组,是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除.比如:

ArrayList al = new ArrayList();
//新增数据
al.Add("abc"); 
al.Add(123);
//修改数据
al[2] = 345;
//移除数据
al.RemoveAt(0);
//插入数据 
al.Insert(0, "hello world");

从上面示例看,ArrayList好像是解决了数组中所有的缺点,那么它应该就是完美的了,为什么在C#2.0后又会出现List呢?

List

在ArrayList中,我们不仅插入了字符串”abc”,而且又插入了数字123。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据都当作为object类型来处理。这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗。

正是因为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泛型的好处: 通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从您转移给了编译器。不需要编写代码来检测数据类型是否正确,因为会在编译时强制使用正确的数据类型。减少了类型强制转换的需要和运行时错误的可能性。泛型提供了类型安全但没有增加多个实现的开销。

总结

上一篇 下一篇

猜你喜欢

热点阅读