数组
一维数组声明与初始化
C# 中数组是引用类型,存储在堆上。声明数组时使用类型加方括号,下标从 0 开始。
示例
CSHARP
int[] nums1 = new int[5];
int[] nums2 = new int[5] { 10, 20, 30, 40, 50 };
int[] nums3 = { 1, 2, 3, 4, 5 };
string[] names = { "Alice", "Bob", "Carol" };
Console.WriteLine(nums1[0]);
Console.WriteLine(nums2[2]);
Console.WriteLine(nums3.Length);
Console.WriteLine(names[1]);
TEXT
0
30
5
Bob
⚠️ new int[5] 创建的数组元素自动初始化为默认值(int 为 0,string 为 null)。
数组下标访问与越界检查
C# 数组通过下标访问元素,且运行时执行边界检查,越界会抛出 IndexOutOfRangeException,这不同于 C 语言的未定义行为。
示例
CSHARP
int[] nums = { 10, 20, 30, 40, 50 };
nums[0] = 99;
Console.WriteLine(nums[0]);
Console.WriteLine(nums[nums.Length - 1]);
try
{
int val = nums[5];
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("下标越界!");
}
TEXT
99
50
下标越界!
💡 使用 Length 属性获取数组长度,而非 C 中的 sizeof。
Array 类常用方法
Array 类提供了排序、反转、查找、复制等静态方法,可直接操作数组。
示例
CSHARP
int[] nums = { 5, 3, 8, 1, 9, 2 };
Array.Sort(nums);
Console.WriteLine(string.Join(", ", nums));
Array.Reverse(nums);
Console.WriteLine(string.Join(", ", nums));
int idx = Array.IndexOf(nums, 8);
Console.WriteLine(idx);
int[] copy = new int[3];
Array.Copy(nums, copy, 3);
Console.WriteLine(string.Join(", ", copy));
Array.Clear(nums, 0, 2);
Console.WriteLine(string.Join(", ", nums));
Array.Resize(ref nums, 8);
Console.WriteLine(nums.Length);
TEXT
1, 2, 3, 5, 8, 9
9, 8, 5, 3, 2, 1
1
9, 8, 5
0, 0, 5, 3, 2, 1
8
📌 Clear 将指定范围的元素设为默认值,并非删除。Resize 可改变数组长度。
多维数组(矩形数组)
多维数组也叫矩形数组,每行长度相同。声明时使用逗号区分维度,例如 int[,] 表示二维数组。
示例
CSHARP
int[,] matrix = new int[3, 4];
matrix[0, 0] = 1;
matrix[1, 2] = 5;
matrix[2, 3] = 9;
int[,] grid = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Console.WriteLine(grid[0, 1]);
Console.WriteLine(grid[2, 0]);
Console.WriteLine(grid.Length);
Console.WriteLine(grid.Rank);
TEXT
2
7
9
2
💡 Rank 返回数组维度数,Length 返回总元素个数(各维度之积)。
锯齿数组
锯齿数组是数组的数组,每行可以有不同的长度。声明时使用多个方括号。
示例
CSHARP
int[][] jagged = new int[3][];
jagged[0] = new int[] { 1, 2 };
jagged[1] = new int[] { 3, 4, 5, 6 };
jagged[2] = new int[] { 7, 8, 9 };
Console.WriteLine(jagged[0].Length);
Console.WriteLine(jagged[1][2]);
Console.WriteLine(jagged[2][0]);
int[][] scores = {
new int[] { 90, 85 },
new int[] { 78, 92, 88 },
new int[] { 95 }
};
Console.WriteLine(scores[1][1]);
TEXT
2
5
7
92
⚠️ 锯齿数组与矩形数组不同:int[,] 是连续内存的二维数组,int[][] 是一维数组且每个元素又是独立数组。
foreach 遍历数组
foreach 语句简化了数组遍历,无需手动管理下标,适用于只读遍历场景。
示例
CSHARP
string[] fruits = { "苹果", "香蕉", "橘子", "葡萄" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
int[,] matrix = {
{ 1, 2, 3 },
{ 4, 5, 6 }
};
foreach (int val in matrix)
{
Console.Write(val + " ");
}
Console.WriteLine();
TEXT
苹果
香蕉
橘子
葡萄
1 2 3 4 5 6
📌 foreach 中不能修改数组元素的值,如需修改请使用 for 循环。
数组作为方法参数
数组是引用类型,将数组传递给方法时传递的是引用,方法内对数组元素的修改会影响原数组。
示例
CSHARP
void PrintArray(int[] arr)
{
foreach (int n in arr)
{
Console.Write(n + " ");
}
Console.WriteLine();
}
void DoubleValues(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] *= 2;
}
}
int[] nums = { 1, 2, 3, 4, 5 };
PrintArray(nums);
DoubleValues(nums);
PrintArray(nums);
int Sum(int[] arr)
{
int total = 0;
foreach (int n in arr)
{
total += n;
}
return total;
}
Console.WriteLine(Sum(nums));
TEXT
1 2 3 4 5
2 4 6 8 10
30
⚠️ 因为数组是引用传递,DoubleValues 对原数组的修改会直接反映在调用方。
❓ 常见问题
Q C# 数组和 C 语言数组有什么区别?
A C# 数组是引用类型且自带边界检查,越界抛出异常;C 数组是指针语法,越界为未定义行为。
Q 数组的 Length 属性和 Rank 属性分别返回什么?
A Length 返回数组中元素的总个数,Rank 返回数组的维度数。
Q 锯齿数组和多维数组如何选择?
A 每行长度相同时用多维数组更紧凑;每行长度不同时必须用锯齿数组。
Q foreach 可以修改数组元素吗?
A 不可以,foreach 是只读遍历,如需修改元素值请用 for 循环。
Q Array.Resize 会创建新数组吗?
A 是的,Resize 会创建新数组并复制元素,原数组引用被替换。
📖 小节
- C# 数组是引用类型,使用
类型[]声明,下标从 0 开始 Length获取长度,运行时自动边界检查,越界抛出IndexOutOfRangeExceptionArray类提供Sort、Reverse、IndexOf、Copy、Clear、Resize等静态方法- 多维数组
int[,]每行等长,锯齿数组int[][]每行可不等长 foreach适用于只读遍历,包括多维数组- 数组作为方法参数传递的是引用,方法内修改会影响原数组
📝 作业
- 声明一个包含 10 个整数的数组,用循环赋值为 1~10,然后逆序输出所有元素
- 使用
Array.Sort对一个字符串数组按字母排序,并输出排序结果 - 创建一个 3×3 的二维整数数组,计算并输出对角线元素之和
- 创建一个锯齿数组存储 3 个学生的成绩(每个学生科目数不同),计算每个学生的平均分
- 编写一个方法
int FindMax(int[] arr),接收数组参数并返回其中的最大值



