🧠 一、什么是数组?
数组(Array)是一种固定大小、类型相同的数据结构,用于存储多个相同类型的元素。数组中的每个元素都有一个索引(index),从 0 开始。
✅ 二、数组的基本语法
1. 声明数组
int[] numbers; // 声明一个整型数组
string[] names; // 声明一个字符串数组
Person[] people; // 声明一个对象数组
2. 创建数组(分配空间)
numbers = new int[5]; // 创建一个长度为5的整型数组
names = new string[3]; // 创建一个长度为3的字符串数组
people = new Person[10]; // 创建一个长度为10的对象数组
3. 初始化数组(赋值)
你可以声明、创建、初始化一步到位:
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
string[] names = { "Tom", "Jerry", "Spike" };
Person[] people = new Person[] {
new Person("Alice"),
new Person("Bob")
};
✅ 小技巧:初始化时可以省略
new int[],直接写:
int[] numbers = { 1, 2, 3, 4, 5 };
🧩 三、访问数组元素
数组是通过索引来访问的:
int[] nums = { 10, 20, 30 };
Console.WriteLine(nums[0]); // 输出 10
nums[1] = 99;
Console.WriteLine(nums[1]); // 输出 99
❗注意:索引不能越界,否则会抛出
IndexOutOfRangeException异常。
🧱 四、数组的特性
| 特性 | 说明 |
|---|---|
| 固定大小 | 一旦创建,数组大小不能改变 |
| 类型一致 | 所有元素必须是相同类型 |
| 引用类型 | 数组本身是一个引用类型,分配在堆上 |
| 索引从0开始 | 第一个元素是 array[0] |
| 支持多维数组 | 如二维数组、交错数组(锯齿数组) |
📐 五、数组的类型
1. 一维数组(最常见)
int[] arr = { 1, 2, 3 };
2. 多维数组(矩形数组)
int[,] matrix = new int[2, 3] {
{ 1, 2, 3 },
{ 4, 5, 6 }
};
Console.WriteLine(matrix[0, 1]); // 输出 2
- 语法:
int[,]表示二维数组。 - 所有行长度一致(矩形)。
3. 交错数组(Jagged Array,锯齿数组)
数组的数组,每一行可以有不同的长度。
int[][] jagged = new int[][] {
new int[] { 1, 2 },
new int[] { 3, 4, 5 },
new int[] { 6 }
};
Console.WriteLine(jagged[1][2]); // 输出 5
- 语法:
int[][]表示二维交错数组。 - 每个子数组可以独立创建,长度可以不同。
📏 六、数组的常用属性和方法
| 属性/方法 | 描述 |
|---|---|
Length | 获取数组的总元素个数 |
Rank | 获取数组的维数(例如二维数组返回 2) |
GetValue(index) | 获取指定索引的元素(适用于所有数组) |
SetValue(value, index) | 设置指定索引的元素 |
GetLength(dimension) | 获取指定维度的长度(用于多维数组) |
示例:
int[,] matrix = new int[3, 4];
Console.WriteLine(matrix.Length); // 输出 12
Console.WriteLine(matrix.Rank); // 输出 2
Console.WriteLine(matrix.GetLength(0)); // 输出 3(行数)
Console.WriteLine(matrix.GetLength(1)); // 输出 4(列数)
🧹 七、数组的遍历
1. 使用 for 循环
int[] numbers = { 1, 2, 3, 4, 5 };
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}
2. 使用 foreach(推荐)
foreach (int num in numbers)
{
Console.WriteLine(num);
}
✅ 优点:语法简洁,避免越界错误。 ❌ 缺点:不能修改原数组元素(除非使用
ref)
🧩 八、数组的复制
1. 使用 Array.Copy
int[] source = { 1, 2, 3 };
int[] dest = new int[5];
Array.Copy(source, dest, source.Length);
2. 使用 CopyTo
source.CopyTo(dest, 0);
3. 使用 Clone()(浅拷贝)
int[] copy = (int[])source.Clone();
⚙️ 九、数组的排序和查找
C# 提供了 System.Array 类的静态方法,可以直接对数组进行操作。
排序:
int[] numbers = { 5, 2, 8, 1 };
Array.Sort(numbers); // 排序后:1, 2, 5, 8
反转:
Array.Reverse(numbers); // 反转后:8, 5, 2, 1
查找:
int index = Array.IndexOf(numbers, 5); // 返回 0(索引)
🧩 十、与 List<T> 的对比(进阶)
| 特性 | 数组 | List<T> |
|---|---|---|
| 大小固定 | ✅ 是 | ❌ 否 |
| 访问速度快 | ✅ | ✅ |
| 插入/删除慢 | ✅ | ❌(数组慢)✅(List 优化) |
| 类型安全 | ✅ | ✅ |
| API 丰富 | ❌(较少) | ✅(丰富) |
| 适合场景 | 数据量固定、高性能访问 | 动态数据、频繁增删 |
✅ 建议:如果你知道数据量固定,优先使用数组;如果需要动态扩容,优先使用
List<T>。
🧠 十一、常见错误和注意事项
| 错误 | 原因 | 修复方式 |
|---|---|---|
| 索引越界 | 访问了 array[array.Length] | 使用 for 或 foreach 控制范围 |
修改 foreach 中的元素无效 | foreach 是只读的 | 改用 for |
| 多维数组维度搞错 | matrix[行, 列] | 记住是 matrix[row, col] |
| 忘记初始化数组 | int[] arr; arr[0] = 1; | 先 new int[5] 再访问 |
想扩容数组却没用 List<T> | 数组不能扩容 | 改用 List<T> |
🧪 十二、进阶技巧(高级用法)
1. 使用 ref 遍历数组(C# 7.0+)
int[] numbers = { 1, 2, 3 };
foreach (ref int num in numbers)
{
num *= 2; // 直接修改原数组
}
2. 使用 Span<T> 操作数组片段(C# 7.2+)
int[] numbers = { 1, 2, 3, 4, 5 };
Span<int> slice = numbers.AsSpan(1, 3); // 取索引1开始的3个元素:2, 3, 4
foreach (int x in slice)
{
Console.WriteLine(x);
}
✅ 十三、总结一句话:
C# 中的数组是一种固定大小、类型统一、索引从0开始的引用类型,适合用于数据量固定、访问频繁的场景。
913

被折叠的 条评论
为什么被折叠?



