C#数组

  • 数组是对象

    • 属性 Rank:
      • 对于矩形数组,返回秩/维度,
      • 对于交错数组,返回1
    • 属性 Length:
      • 对于矩形数组,返回数组总长度(可以使用方法GetLength获取每一维的长度,参数从0开始代表最高维)
      • 对于交错数组,返回最高维的维度长度
  • 基本概念

    • 元素
    • 秩/维度
    • 维度长度:这一维的长度
    • 数组长度:所有维度的长度之和
  • 多维数组

    • 矩阵数组
      • 每行(以二维数组为例)的长度都一样
      • 使用同一组中括号,用逗号(被称为秩说明符)隔开不同维度的长度/索引
    • 交错数组
      • 数组的每个元素都是独立的数组
      • 每行(以二维数组为例)长度可以不同
      • 每一维都是用一个方括号
  • 一维数组和矩形数组

    • 一维数组
      • 声明: int[] a;
      • 实例化:int[] a = new int[10];
      • 初始化:int[] a = new int[] {1, 2, 3};
      • 省略new:int[] a = {1, 2, 3};
    • 矩形数组
      • 声明:int[,] b;
      • 实例化:int[,] b = new int[3, 4];
      • 初始化:int[,] b = new int[,] { {1, 2}, {3, 4} };
      • 省略new:int[,] b = { {1, 2}, {3, 4} };
  • 交错数组

    • 数组的数组
    • 实例化时,只允许指定最高维的长度
      • int[][] a = new int [3][];是可以的
      • int[][] a = new int [3][4];是不允许的
    • 初始化时,每一行都要new
    • 交错数组的某一维可以是矩形数组
  • 比较交错数组和矩形数组

    • 交错数组
      • 多个数组对象
      • 更复杂
      • 有对一维数组的优化
      • foreach按层遍历
    • 矩形数组
      • 一个数组对象
      • 较简单
      • 没有优化
      • foreach遍历所有元素
    • 在CIL中,一维数组有特点的指令用于性能优化,矩形数组没有这些指令,并且不在相同级别进行优化。
    • 因此,有时使用一维数组(可以被优化)的交错数组比矩形数组(不能被优化)更有效率
    • 另一方面,矩形数组的编程复杂度要小很多,因此它会被作为一个单元而不是数组的数组
  • 数组协变

    • 类似于Java中上转型对象
    • 即对于父类引用的数组,每个元素对应的引用实际指向子类
  • 数组继承自System.Array类的属性方法

    • 属性
      • Rank: 实例属性,获取总维度数
      • Length:实例属性,获取数组中所有维度的元素总和
    • 方法
      • GetLength:实例方法,返回指定维度长度
      • Clear:静态方法,将某一范围内的元素值设置为0或null
      • Sort:静态方法,在一维数组中对数组进行排序
      • BinarySearch:静态方法,使用二分搜索一维数组中的值
      • Clone:实例方法,进行数组的浅复制
      • IndexOf:静态方法,返回一维数组中遇到的第一个值
      • Reverse:静态方法,反转数组某一范围的元素
      • GetUpperBound:实例方法,获取指定维度的上界(不同于C++中的STL