方法是一段带有名称的代码块。你可以在程序其他位置通过调用方法名执行这段代码,也能向方法传入数据、并接收方法返回的输出数据。
方法的构成
正如前面说的,方法是类的函数成员。
方法其实就是函数,当一个函数属于类里面的函数的时候,就换了一个名字叫方法。在C语言中,都叫函数。
方法由两大核心部分组成:方法头(方法声明头) 和 方法体。
- 方法头:定义方法全部特征,包含以下信息:
- 方法是否有返回值,若有则指定返回值类型
- 方法名称
- 可传入 / 传出的数据类型,以及数据的处理规则
- 方法体:由可执行代码语句序列构成。程序执行会从方法体内第一条语句开始,按顺序逐条执行。
看例子
string Introduce(string name,int age)
{
string words = $"hello my name is {name},i'm {age} years old";
Console.WriteLine(words);
return words;
}Code language: C# (cs)
方法头: string Introduce(string name,int age)
:返回值类型 是字符串stringIntroduce:方法名(string name,int age):参数列表,这两个也是一个变量,是接收外面传进来的名字和年龄值,然后在函数体中就可以使用了

如何调用这个方法?
因为方法是在Program的,和Main方法同在一个类中,但是Main方法是static,静态的,静态的方法,是不能直接调用非静态的方法的,如果要调用Introduce,则需要先创建一个Program的实例,然后再调用。
class Program
{
static void Main()
{
Program program = new Program();
program.Introduce("John", 30);
}
string Introduce(string name,int age)
{
string words = $"hello my name is {name},i'm {age} years old";
Console.WriteLine(words);
return words;
}
}Code language: C# (cs)
如下这样直接调用,会报错

正确的做法是在Main函数中先new一个Program的实例,然后通过实例来调用Introduce
Program program = new Program();//√
program.Introduce("John", 30);Code language: C# (cs)
方法体
方法体内包含0条或者多条执行语句。
方法体是一个代码块(大括号包裹的一组语句),代码块内可包含以下内容:
- 局部变量
- 流程控制结构(循环、分支等)
- 方法调用,调用其他方法
- 嵌套子代码块
- 内部局部函数(定义在方法内的子方法)[后面学习]
class Program
{
static void Main()
{
int age = 3; // 局部变量,初始值3
while (age > 0) // 流程控制结构
{
--age;
Introduce("Tom", age); // 方法调用
}
{
//嵌套的子代码块
}
}
static string Introduce(string name,int age)
{
string words = $"hello my name is {name},i'm {age} years old";
Console.WriteLine(words);
return words;
}
}
Code language: JavaScript (javascript)
上面代码,把Introduce函数也改为了static,看前面多了一个static,这样它就变成了静态函数了,然后在Main函数中就可以直接调用了,不在需要通过实例来调用。
局部变量(Local Variables)
和前面说到实例字段一样,局部变量用于存储数据;但实例字段一般保存对象状态,局部变量仅用于临时、单次计算的数据存储。
当局部变量所在的方法执行结束,局部变量就会出栈,如果是值类型,就直接销毁,如果是引用类型,就会在某个时间被垃圾回收器销毁。
1. 局部变量声明语法
类型 变量名 = 初始值;
变量名:自定义标识符= 初始值:可选初始化器,用于给变量赋初始值
2. 局部变量核心规则
- 生命周期与作用域:仅存在于定义它的代码块,以及该块内所有嵌套子块
- 变量在声明的代码行才创建生效
- 代码块执行完毕后,变量直接销毁失效
- 声明位置无限制:可写在方法体内任意位置,但必须先声明,后使用
static void Main()
{
int age = 3; //局部变量
Phone p = new Phone(); //自定义类型的局部变量
{
int one = 1; //属于子代码块的局部变量
bool two = false;
}
double d = 0;
}Code language: JavaScript (javascript)

实例字段 vs 局部变量
| 实例字段 | 局部变量 | |
|---|---|---|
| 生命周期 | 对象实例创建时生成; 对象无法访问时销毁 | 声明代码行生效; 所属代码块执行完毕销毁 |
| 默认初始化 | 编译器自动赋予该类型默认值 | 无自动初始化; 未赋值就使用会直接编译报错 |
| 内存存储 | 全部存放在堆(Heap), 无论值类型 / 引用类型 | 值类型:栈 (Stack); 引用类型:引用存栈,对象数据存堆 |