1. C#里的函数/方法
你已经学了不少C#命令了,所以你现在能写挺复杂的程序了。10、20、30行代码的程序——其实不算大,对吧?
但如果一个程序有100+行,那就算大了,代码看起来就有点头大了。那怎么让写和读这种大程序变简单点呢?
可以的,这时候方法(函数)就能帮上忙了。
那方法到底是啥?简单说,方法就是一组有独特名字的命令。换句话说,就是把几条命令打包成一组,给它起个独一无二的名字。就这样——方法就搞定了。
比如你有一段画猫的代码:
Console.WriteLine(" |\\__/,| (`\\");
Console.WriteLine(" |o_o |__ _) )");
Console.WriteLine(" (____/ (_/ ");
它会输出:
|\__/,| (`\
|o_o |__ _) )
(____/ (_/
你可以把它单独放进一个方法里,想画多少只猫都行:
void WriteCat()
{
Console.WriteLine(" |\\__/,| (`\\");
Console.WriteLine(" |o_o |__ _) )");
Console.WriteLine(" (____/ (_/ ");
}
//画三只猫
WriteCat();
WriteCat();
WriteCat();
当程序运行时,每次执行WriteCat(),它就会把WriteCat()里的所有命令都跑一遍。我们就是把几条命令打包成了一个新命令(方法)。
函数的意义:
- 把程序分成小块,每块只管自己的事。
- 方便复用:写一次,随便用多少次都行。
- 减少出错:函数里有bug只要改一处就行。
- 给复杂操作起名字——代码可读性直接提升。
术语:函数、方法、过程
在C#里,函数和方法基本是一个意思,不过有点小区别。
- 方法——属于类或对象的函数(C#里几乎全是方法)。
- 过程——不返回值的函数(void方法)。
- 函数——广义上说就是任何有名字、能被调用的程序片段。
官方说法C#里这些都叫方法,但你要是后面看到“函数”也别慌!
2. 方法声明语法:逐步拆解
来拆解个最简单的函数,经典的“Hello, World!”,不过把输出单独放进方法里:
using System;
class Program
{
static void Main()
{
PrintHello();
}
static void PrintHello() // 输出Hello, World!
{
Console.WriteLine("Hello, World!");
}
}
语法拆解:
| 部分 | 例子 | 说明 |
|---|---|---|
| 修饰符 | |
表示方法属于类(详细后面讲) |
| 返回值类型 | |
表示方法啥都不返回 |
| 方法名 | |
调用方法时用的名字 |
| 参数 | |
参数(空的就是没参数) |
| 方法体 | |
调用方法时要执行的代码 |
类比:
方法就像咖啡机:你投钱(参数),按按钮(调用方法),咖啡机煮咖啡(方法体),然后给你结果(返回值)——如果是void方法就啥都不返回!
3. 怎么调用方法
调用方法就是写方法名加括号就行了:
PrintHello(); // 没参数的方法
int sum = Add(2, 3); // 有参数和返回值的方法
注意:只能在方法声明之后(或者代码里“上面”声明,或者在同一个类里)才能调用方法。
4. 带参数的方法
方法可以接收参数,这样方法的行为就很灵活,啥场景都能用。其实参数就是方法里的变量,调用方法时给它们赋值。声明方法时要写参数。
static void Greet(string name)
{
Console.WriteLine($"你好, {name}!");
}
// 用法:
Greet("爱丽丝");
Greet("鲍勃");
参数——就是你调用方法时传进去的变量。
| 部分 | 例子 | 说明 |
|---|---|---|
| 参数类型 | |
接收的值的类型 |
| 参数名 | |
在方法里用的名字 |
调用:
Greet("爱丽丝"); —— name就拿到"爱丽丝"这个值。
多个参数
可以用逗号声明多个参数:
static void PrintSum(int a, int b)
{
Console.WriteLine($"和: {a + b}");
}
// 用法:
PrintSum(5, 7); // 和: 12
5. 值参数和引用参数
函数的参数就是普通变量,跟别的变量规则一样。
所以要记住:你把数组传给方法时,传的是引用,也就是说方法能改数组内容。简单类型(int、double)传的是值,会复制一份。
static void ZeroFirstGrade(int[] grades)
{
grades[0] = 0; // 会改原数组!
}
// 用法:
int[] a = {1, 2, 3, 4, 5};
ZeroFirstGrade(a);
Console.WriteLine(a[0]); //会输出0
其实这里发生了啥:
static void ZeroFirstGrade(int[] grades)
{
grades[0] = 0; // 会改原数组!
}
// 用法:
int[] a = {1, 2, 3, 4, 5};
//ZeroFirstGrade(a);
int[] grades = a;
grades[0] = 0;
Console.WriteLine(a[0]); //会输出0
GO TO FULL VERSION