🐸 青蛙编程网
首页 / C# / C# 基础 / 5. 数组与方法

数组与方法

这是什么:数组——一排同类型的"盒子",按下标取东西;方法——打包起来、随叫随到的一段代码。

为什么用:数据一多就需要"排排站"的容器,代码一长就需要"随叫随到"的零件。注意:一个数组里只能装同一种类型——这正是第 3 章"类型标签"的好处,编译器帮你盯着别装错。

如何用:本章先用一个 int[] 数组存取成绩,再给一段重复代码起个方法名,随叫随到。

数组:一排同类型的盒子

int[] scores = { 90, 85, 77 };

Console.WriteLine(scores[0]);
Console.WriteLine(scores.Length);
90
3

下标从 0 开始:scores[0] 是第一个,scores[2] 是最后一个(第 3 个)。越界访问(比如 scores[3])会直接报错。

遍历用 foreach 最顺手:

foreach (int s in scores)
{
    Console.WriteLine($"成绩:{s}");
}
成绩:90
成绩:85
成绩:77

foreach 拿不到下标。需要第几个时改用 for:for (int i = 0; i < scores.Length; i++) 循环里 scores[i] 就是第 i 个。

操作 写法 说明
取第 n 个 scores[n-1] 下标从 0 数起
个数 scores.Length 上面是 3
挨个处理 foreach (int s in scores) 依次拿到每个值

方法:给一段代码起名字

方法就是"把一段代码装进名字里,随叫随到":

int sum = Add(3, 5);
Console.WriteLine($"3 + 5 = {sum}");

int Add(int a, int b)
{
    return a + b;
}
3 + 5 = 8
部件 含义
int Add(int a, int b) 方法名 Add;括号里是参数(进来的原料);开头的 int 是返回值类型(出去的成品)
return 把结果交回去,方法到此结束
Add(3, 5) 调用:3 和 5 传进去,得到 8

在顶级语句写法里,方法直接写在文件末尾就行;老式 class 写法里前面要加 static——现在见到认识即可。另外,不交成品的方法返回值类型写 void,比如 void SayHi(string name) 里只打印、不 return。

方法重载:同名不同参

C# 允许同名方法共存,只要参数不同:

int Area(int w, int h) => w * h;      // 矩形面积
double Area(double r) => 3.14 * r * r; // 圆形面积

Console.WriteLine(Area(3, 4));   // 12
Console.WriteLine(Area(2.0));    // 12.56

out / ref:参数还能"往回带"

普通参数只能"进";加上 out 就能顺便"出"一个结果:

bool ok = int.TryParse("123", out int n);  // 转换成功 ok 为 true,n 得到 123

ref 则是把变量本身递进去,方法里改了就是真改。现阶段见到认识就够,学面向对象之后再细品。

❓ 常见问题

Q1:数组长度能改吗?

不能。int[] scores = { 90, 85, 77 } 长度固定是 3。需要会变长的容器,用第 7 章的 List<T>。

Q2:方法一定要有返回值吗?

不是。返回值类型写 void 表示不返回任何东西,方法里只干活不交成品。

Q3:方法里能定义方法吗?

不能。C# 方法不能嵌套定义(除了局部函数,进阶话题)。所有方法都写在类级别或文件顶级。

⚠️ 新手翻车现场

翻车一:数组越界

int[] scores = { 90, 85, 77 };
Console.WriteLine(scores[3]);  // ❌ IndexOutOfRangeException

问题:只有 3 个元素,有效下标是 0~2,下标 3 已经越界。

修正:访问前检查 i < scores.Length。

翻车二:void 方法试图 return 一个值

void SayHi()
{
    return "你好";  // ❌ void 方法不能返回值
}

问题:void 表示不返回任何东西,return 后面不能跟值。

修正:改成 string SayHi() { return "你好"; }。

翻车三:方法参数类型不匹配

int Add(int a, int b) => a + b;
Add(3, "5");  // ❌ 编译报错:不能将 string 转换为 int

问题:C# 是强类型,参数类型必须严格匹配。

修正:Add(3, 5),两个都是 int。

🎯 什么时候用数组/方法

场景 推荐 原因
固定数量同类型数据 数组 int[] 轻量、下标随机访问快
数量会变的同类型数据 List<T>(第 7 章) 动态增长
一段代码要复用 方法 抽出来,随叫随到
同一操作,不同参数类型 方法重载 方法名相同,参数不同

📝 本章小结

  • 数组 int[] 是固定长度、同类型的容器,下标从 0 起,越界会报错
  • foreach 遍历数组最省心,但拿不到下标;要下标用 for
  • 方法 = 返回类型 + 方法名 + 参数列表 + 方法体
  • 方法重载:同名不同参可共存,编译器按参数挑选
  • void 表示不返回值;out/ref 能让参数"往回带"结果
  • 记忆口诀:数组排排站,下标从 0 数;方法是零件,参数进、return 出。

动手改

  1. 数组里再加一个成绩,别的都不动,foreach 会自动多打一行吗?
  2. 写一个 Greet(string name) 方法,返回"你好,某某!",调用三次传三个名字
  3. 写一个 Max(int a, int b) 返回较大值,试试 Max(3, 7)
  4. 给 Area 加一个重载:double Area(double r) 算圆面积

下一章:字符串,程序里最常见的"数据"长什么样 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。