文章目录
13.1 数组
13.1.1 定义
- 元素:数组的独立数据项。
- 秩/维度:数组的维度数称作秩。
- 维度长度:每个维度方向的位置个数。
- 数组长度:所有维度中的元素总数。
13.1.2 重要细节
- 数组一旦创建就固定了。C# 不支持动态数组。
- 数组索引号从 0 开始。
13.2 数组的类型
C# 提供以下两种类型的数组:
-
一维数组。
-
多维数组。
-
矩形数组。
- 某个维度的所有子数组长度相同。
- 仅使用一组方括号表示。
-
交错数组。
- 每个子数组都是独立的。
- 可以有不同长度的子数组。
- 每一个维度使用一个方括号表示。
-
![image-20231028233858258](https://i-blog.csdnimg.cn/blog_migrate/184ab84d4304e58e8490dceb730cfba2.png#pic_center)
13.3 数组是对象
数组是继承了 System.Array 类型的对象,具有 BCL 基类中很多有用的成员:
- Rank:属性,返回数组的维度。
- Length:属性,返回数组的长度。
![image-20231028234121805](https://i-blog.csdnimg.cn/blog_migrate/345d015e02f4418fe22ba073e1c5f216.png#pic_center)
13.4 一维数组和矩形数组
声明一维数组或多维数组
在类型和变量名称之间使用方括号声明数组,方括号内的逗号是秩说明符,指定了数组的维度数:秩 = 逗号数 + 1。
- 可以有任意多个秩说明符(逗号)。
- 不能在数组类型区域中放数组维度长度(维度长度不是类型的一部分)。
- 数组声明后,维度就固定了。而维度长度直到数组实例化时才决定。
![image-20231028234602373](https://i-blog.csdnimg.cn/blog_migrate/326aeab59e25809a0095f5ad979c772b.png#pic_center)
13.5 实例化一维数组或矩形数组
使用 new 运算符实例化:
![image-20231028235251526](https://i-blog.csdnimg.cn/blog_migrate/2afbf041cdf7b836a05de18d566dd876.png#pic_center)
![image-20231028235303201](https://i-blog.csdnimg.cn/blog_migrate/5a629eb8c9d98f48959ac14c3c1c98e3.png#pic_center)
![image-20231028235316531](https://i-blog.csdnimg.cn/blog_migrate/02e304a26329e83da9d91afd666f97d1.png#pic_center)
13.6 访问数组元素(*)
13.7 初始化数组
数组被创建后,每个元素被自动初始化为类型的默认值。
- 整型:0。
- 浮点型:0.0。
- 布尔型:false。
- 引用类型:null。
13.7.1 显示初始化一维数组
使用初始化列表进行初始化:
- 初始值以逗号分隔,封闭在大括号内。
- 不必输入维度长度,编译器可以进行推断。
![image-20231028235950901](https://i-blog.csdnimg.cn/blog_migrate/57d730645dc4e1f5ae3c48a1bc548dad.png#pic_center)
13.7.2 显示初始化矩形数组
- 每个初始值向量必须封闭在大括号内。
- 每个维度必须嵌套并封闭在大括号内。
- 每个维度的初始化列表和组成部分也使用逗号分隔。
![image-20231029000205626](https://i-blog.csdnimg.cn/blog_migrate/71d49cbe2e5d23e56f97a853f2f93a4d.png#pic_center)
13.7.3 初始化矩形数组的语法点(*)
13.7.4 快捷语法
可以省略语法的数组创建表达式部分,只提供初始化部分:
![image-20231029000836345](https://i-blog.csdnimg.cn/blog_migrate/7a29a7f31755fd942a2624f77712bcdf.png#pic_center)
13.7.5 隐式类型数组
由于智能的编译器,可以使用 var 关键字进一步简化声明隐式数组:
![image-20231029001138210](https://i-blog.csdnimg.cn/blog_migrate/afb880b471e8a7eed8c7afeca5a24a1a.png#pic_center)
13.7.6 综合内容(*)
13.8 交错数组
13.8.1 声明交错数组
- 和矩形数组一样,数组类型声明部分不能包含维度长度。
![image-20231029001527294](https://i-blog.csdnimg.cn/blog_migrate/bca27ff405737e58d23eea18930a9c88.png#pic_center)
13.8.2 快捷实例化
可以快捷创建顶层数组的声明:
![image-20231029001753063](https://i-blog.csdnimg.cn/blog_migrate/a3d709175714f445c80d01ae14a90b28.png#pic_center)
![image-20231029001807546](https://i-blog.csdnimg.cn/blog_migrate/11f48721b7e3a7e5855ad8677d9b8a20.png#pic_center)
![image-20231029001819337](https://i-blog.csdnimg.cn/blog_migrate/4fa12523a1cf029262aa160c1741b8a4.png#pic_center)
13.8.3 实例化交错数组
交错数组的初始化不能在一个步骤中完成,需要以下步骤:
- 实例化顶层数组。
- 分别实例化每一个子数组。
![image-20231029002021158](https://i-blog.csdnimg.cn/blog_migrate/9af78bd5007bea63a75f0405cabb206e.png#pic_center)
13.8.4 交错数组中的子数组(*)
13.9 比较矩形数组和交错数组
图 13.12 展示了保存 9 个整数的矩形数组和交错数组。矩形数组只有单个数组对象,而交错数组有 4 个数组对象。
![image-20231029234022522](https://i-blog.csdnimg.cn/blog_migrate/e29f302700258032972872ca3f9b0392.png#pic_center)
CIL 中,一维数组有特定的性能优化指令,而矩形数组没有。因此,有时使用一维数组的交错数组比矩形数组更高效。
13.10 foreach 语句
13.10.1 迭代变量是只读的
- 对于值类型数组,不能改变数组元素。
- 对于引用类型数组,不能改变引用,可以通过迭代变量改变数据。
13.10.2 foreach 语句和多维数组
-
矩形数组
维度处理次序为从右向左,每个维度从 0 开始递增。递增满时,重置为 0,左方维度索引递增。
-
交错数组
必须为每一个维度使用独立的 foreach 语句。
13.11 数组协变
**数组协变:**即使某个对象不是数组的基类型,也可以把它赋值给数组元素。发生的条件如下:
- 为引用类型数组。
- 在复制对象和数组基类型之间有隐式或显示转换。
![image-20231029235139038](https://i-blog.csdnimg.cn/blog_migrate/e8649cb8cf44e6ddf74e6acf61790786.png#pic_center)
![image-20231029235212543](https://i-blog.csdnimg.cn/blog_migrate/888ead92682a89be9c5408f83bc7c1b5.png#pic_center)
![image-20231029235229032](https://i-blog.csdnimg.cn/blog_migrate/21900f1416b29951a99d6b7d1add165f.png#pic_center)
13.12 数组继承的有用成员
![image-20231029235310161](https://i-blog.csdnimg.cn/blog_migrate/18691dbb51fe81a0e6d6dc60385866b2.png#pic_center)
13.13 比较数组类型
![image-20231029235426636](https://i-blog.csdnimg.cn/blog_migrate/ee8843982df3fb2429691a6cef29d9dd.png#pic_center)
13.14 数组与 ref 返回和 ref 局部变量
![image-20231029235615041](https://i-blog.csdnimg.cn/blog_migrate/99ebd302aa157fa5346164da59059042.png#pic_center)