【CLR Via C#】16 数组

  • 所有的数组都隐式的从System.Array抽象类派生,后者又派生自System.Object
  • 数组是引用类型,所以会在托管堆上分配内存,数组对象占据的内存块包含数组的元素,一个类型对象指针、一个同步块索引和一些额外的成员。
  • 所有的数组都隐式的实现IEnumerable,ICollection和IList接口,只是实现这些接口,而非实现其泛型接口IEnumerable<T>等,其主要是考虑到多维数组和非零基数数组(非零基数是指数组的索引值不从0开始)。在创建一个数组的时候,会自动使数组类型实现IEnumerable<T>等接口。
  • 数组的转型条件必须是维数和并需存在一个隐式或显示的转换。如下代码所示
    string [] strArray=new string[]{"luge","luya"}; 
    object[] objArray=strArray;//转换成功
    int [] intArray=new int[]{1,2};
    objArray=intArray;//转换失败
  • 零基数组和非零基数组
     对于非零基数组的创建方式如下所示:
    Array intArray=Array.CreateInstance(typeof(Int32),new int[]{5},new int[]{1});
    Console.WriteLine(intArray.GetLowerBound(0));//1
    Console.WriteLine(intArray.GetUpperBound(0));//5
  • 多维数组(Multi-dimension)与交错数组(jagged Array)

  多维数组:一个整体的数组,在内存中占据一整块托管堆内存块

  交错数组:数组元素的维数和大小可以不同,交错数组有时候称为数组的数组。通过二维交错数组为例。其内存分配,通过第一维元素找到相对应的数组元素,如下例子所示,通过arr[0]的指向可以找到new int[5]的数组元素。从这例子中可以看到,对于一个二维且维数为2的交错数组,需要初始化3次数组。这样会产生效率问题。可以看出交错数组的消耗主要在创建和销毁上。
  日常的应用中,如果有多次访问,应该使用交错数组;对于一次访问应该使用多维数组
       //声明
        int[][] arr = new int[2][];
        // 初始化元素
        arr[0] = new int[5] { 1, 3, 5, 7, 9 };
        arr[1] = new int[4] { 2, 4, 6, 8 };    
posted @ 2014-03-15 21:07  卤鸽  阅读(363)  评论(0编辑  收藏  举报