你的位置:首页 > 软件开发 > ASP.net > 编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组

编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组

发布时间:2015-08-13 19:00:19
建议16:元素数量可变的情况下不应使用数组在C#中,数组一旦被创建,长度就不能改变。如果我们需要一个动态且可变长度的集合,就应该使用ArrayList或List<T>来创建。 而数组本身,尤其是一维数组,在遇到要求高效率的算法时,则会专门被优化以提升其效率。一维数组也 ...

建议16:元素数量可变的情况下不应使用数组

在C#中,数组一旦被创建,长度就不能改变。如果我们需要一个动态且可变长度的集合,就应该使用ArrayList或List<T>来创建。 而数组本身,尤其是一维数组,在遇到要求高效率的算法时,则会专门被优化以提升其效率。一维数组也成为向量,其性能是最佳的,在IL中使用了专门的指令来 处理它们(如newarr、ldelem、ldelema、ldelen和stelem)。

 

从内存的使用角度来讲,数组在创建时被分配了一段固定长度的内存。如果数组的元素是值类型,则每个元素的长度等于相应的值类型的长度;如果数组的元素是引用类型,则每个元素的长度为该引用类型的IntPtr.Size(IntPtr:It's a class that wraps a pointer that is used when calling Windows API functions. The underlying pointer may be 32 bit or 64 bit, depending on the platform.)。数组的存储结构一旦被分配,就不能再变化。而ArrayList是链表结构,可以动态的增减内存空间,如果ArrayList存储的是值类型,则会为每个元素增加12字节的空间,其中4个字节拥有对象引用,8字节是元素装箱时引入的对象头。List<T>是ArrayList的泛型实现,它省去了装箱和拆箱带来的开销。

注意:

由于数组本身在内存上的特点,因此在使用数组的过程中还应该注意大对象的问题。所谓“大对象”,是指那些占内存超过85000字节的对象,它们被分配在大对象堆里。大对象的分配和回收和小对象都不太一样,尤其是回收,大对象在回收过程中会带来效率很低的问题。所以,不能对数组指定过大的长度,这会让数组成为一个大对象。

 

如果一定要动态改变数组的长度,一种方法是将数组转换为ArrayList或List<T>,如下面代码说是:

      int[] iArr = { 0, 1, 2, 3, 4, 5, 6 };      ArrayList arrayListInt = new ArrayList(iArr);  //将数组转变为ArrayList      arrayListInt.Add(7);      List<int> listInt = iArr.ToList<int>();       //将数组转变为List<T>      listInt.Add(7);

原标题:编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录