数组与方法
这是什么:数组——一排同类型的"盒子",按下标取东西;方法——打包起来、随叫随到的一段代码。
为什么用:数据一多就需要"排排站"的容器,代码一长就需要"随叫随到"的零件。注意:一个数组里只能装同一种类型——这正是第 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 出。
动手改
- 数组里再加一个成绩,别的都不动,foreach 会自动多打一行吗?
- 写一个
Greet(string name)方法,返回"你好,某某!",调用三次传三个名字 - 写一个
Max(int a, int b)返回较大值,试试Max(3, 7) - 给
Area加一个重载:double Area(double r)算圆面积
下一章:字符串,程序里最常见的"数据"长什么样 🐸