404 Not Found

404 Not Found


nginx

数组

一维数组声明与初始化

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 会创建新数组并复制元素,原数组引用被替换。

📖 小节

📝 作业

  1. 声明一个包含 10 个整数的数组,用循环赋值为 1~10,然后逆序输出所有元素
  2. 使用 Array.Sort 对一个字符串数组按字母排序,并输出排序结果
  3. 创建一个 3×3 的二维整数数组,计算并输出对角线元素之和
  4. 创建一个锯齿数组存储 3 个学生的成绩(每个学生科目数不同),计算每个学生的平均分
  5. 编写一个方法 int FindMax(int[] arr),接收数组参数并返回其中的最大值
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏