1、数组
数组实际是由一个变量名称表示的一组相同类型的数据元素。每个元素由数组名【索引】的方式访问。
c#中数组的特性:
1、数组一经创建,长度固定不变
2、索引号从0开始
多维数组有两种类型:矩形数组、交错数组
矩形数组:每个维度的子数组具有相同的维度长度,不管有多少维度,总是使用一个方括号表示
int x = myArray[4,6,1]; //myArray是三维数组
交错数组:每个子数组都是独立数组的多维数组,可以有不同长度的子数组,为每个维度使用一组方括号。
jagArray[2][7][4]
数组实例是system.Array继承类型的对象,从BCL基类中派生,继承了许多成员:
Rank:返回数组维度数的属性;
Length:返回数组长度的属性;
数组是引用类型
数组元素可以是值类型,也可以是引用类型。
一维数组和矩形数组的声明:
int[,,] firstArray;
逗号为秩说明符,数组声明时确定数组的维度,不再改变,声明时不能放数组维度长度,秩是数组类型的一部分,而维度长度不是类型的一部分。维度长度直到实例化的时候才能确定。
实例化:
int[] secondArray = new int[4];
使用数组创建表达式,new运算符,基类名称+【维度长度】;
MyClass mcArr = new MyClass[4];
mcArr是一个包含4个MyClass类型引用的一维数组。
矩形数组: int[,,] arr1 = new int[3,6,2];
显示初始化数组:不必输入数组长度,编译器会通过初始化值的个数推断出长度。
int[] intArr = new int[]{10,20,30,40};
显示初始化矩形数组:每一个初始值向量必须封闭在大括号内,每一个维度也必须嵌套并封闭在大括号内
int[,] intArr2 = new int[,]{{10,1},{2,10},{11,9}};
快捷语法:
隐式类型数组:
交错数组:交错数组是数组的数组,交错数组的子数组的元素个数可以不同。
int[][] jagArr = new int[3][];
jagArr是3个int数组的数组 ,不能在声明语句中初始化顶层数组之外的数组
交错数组的声明:要求每个维度都有自己方括号int[][] SomeArr ;
实例化:交错数组的初始化不能在一个步骤完成,由于交错数组是独立的数组的数组,所以每个数组必须独立创建,应该先实例化顶层数组,之后再分别实例化每一个子数组,把新建数组的引用赋给所属数组的对应元素。
int[][] Arr = new int[3][]; //1、实例化顶层数组
int[0] = new int[]{10,20,30}; //2、实例化子数组
int[1] = new int[]{40,50,60,70};
int[2] = new int[]{80,90,100,110,120};
交错数组的子数组也是数组,所以子数组也可以是矩形数组
int[][.] Arr = new int[3][,];
Arr是有3个二维数组的交错数组
Arr[0] = new int[]{{10,20}.,
{100,200}};
Arr[1] = new int[]{{30,40,50}.,
{300,400,500}};
Arr[2] = new int[]{{60,70,80,90}.,
{600,700,800,900}};
foreach语句:实现循环遍历数组元素
迭代变量是只读的,所以不能改变,对于值类型数组和引用类型数组效果不一样,因为对于引用类型数组来说,迭代变量保存的是引用,对于值类型的数组,通过迭代变量改变数组元素会出现编译错误。
对于引用类型数组,可以通过迭代变量改变数据。
在多维数组中,元素的处理次序是最右边的索引号先从0开始递增,然后是递增他左边的索引号
比如:
int[.] arr1 = {{10,11},
{12,13}};
foreach(var item in arr1)
{Console.WriteLine("{item}");}
处理顺序是arr1[0,0]->arr1[0,1]->arr1[1,0]->arr1[1,1]
交错数组是数组的数组,所以必须为交错数组的每一个维度使用独立的foreach语句
数组协变:在某些情况下,即便某个对象不是数组的基类型,也可以把它赋值给数组元素。
需要满足的条件:数组是引用类型数组、在赋值的对象类型 和数组基类型之间有隐式转换或显式转换,比如用派生类对象赋值给基类型数组元素。
Clone方法:
Clone方法为数组进行浅复制,如果是引用类型数组,不会复制元素引用的对象。克隆值类型数组会产生两个独立的数组。克隆引用类型数组会产生指向相同对象的两个数组。
克隆值类型数组:
克隆引用类型数组:
示例代码:
ref在数组中的常见用途:把数组的一个元素的引用传递回调用域,利用ref返回功能,可以把一个引用作为返回值传到方法体外,而利用ref局部变量,可以在调用域内使用这个引用。