本地函数英文叫:Local Functions,是C# 7.0以后才有的
前面我们学习了方法的调用,方法代码块内可以调用其他方法:
- 类内部的方法:直接写方法名传参调用;
- 跨类方法:需要先创建对应类的实例对象,且目标方法必须标记
public。
从 C# 7.0 开始,支持在一个方法内部直接定义独立函数,称为本地函数:
- 隔离性:仅能在包裹它的外层方法内部调用,外部代码无法访问;
- 优势:代码逻辑收拢、可读性更高、维护更简单;
- 声明规则:和局部变量不同,本地函数可以在外层方法任意位置定义,无需提前声明。
本地函数可捕获外层方法的局部变量,仅作用域局限于包裹方法内。
先补充一个知识点:
函数内部的局部变量,从上往下执行,局部变量需要先声明,后才可以使用,不能反过来。
例如下面代码:hour是在下面才创建的,不能在创建之前访问
int GetHours()
{
Console.WriteLine(hour);
int hour = DateTime.Now.Hour;
return hour;
}Code language: C# (cs)
尽管说hour的作用域是方法体,但是不能先使用后创建的。

会出现红色波浪线错误。错误提示如上
和我们的函数不一样,函数可以下面的函数调用上面的函数,因为函数是属于类里面的成员,它们是记录在Method Table(方法表)里面的,调用的时候,是去查询方法表,不是从上往下执行的。

上面的Main调用下面的GetHours,这里和前面的局部变量定义使用是不一样的。
class Program
{
static void Main()
{
Program program = new Program();
program.GetHours();
}
int GetHours()
{
int hour = DateTime.Now.Hour;
return hour;
}
}Code language: C# (cs)
回到我们的本地函数
看例子
class Program
{
static void Main()
{
Program program = new Program();
program.ZoomIn();
}
public void ZoomIn()
{
//允许本地函数的上面调用本地函数
int results0 = ZoomIn5(10);
Console.WriteLine($"A: {results0}");
// 本地函数,把传入的只val放大5倍返回
int ZoomIn5(int val)
{
return val * 5;
}
// 调用本地函数
int results = ZoomIn5(10);
Console.WriteLine($"B: {results}");
int results2 = ZoomIn5(5);
Console.WriteLine($"C: {results2}");
}
}
Code language: C# (cs)
本地函数的调用,本地函数的作用域是所在的函数里面,不管是在本地函数的上面 还是下面 都可以访问它的。
此外本地函数的函数名,甚至和它所在的函数名重名都可以的。
class Program
{
static void Main()
{
Program program = new Program();
program.ZoomIn5();
}
public void ZoomIn5()
{
//允许本地函数的上面调用本地函数
int results0 = ZoomIn5(10);
Console.WriteLine($"A: {results0}");
// 本地函数,把传入的值val放大5倍返回
int ZoomIn5(int val)
{
return val * 5;
}
// 调用本地函数
int results = ZoomIn5(10);
Console.WriteLine($"B: {results}");
int results2 = ZoomIn5(5);
Console.WriteLine($"C: {results2}");
}
}
Code language: C# (cs)
上面本地函数和它所在的函数都叫ZoomIn5,原因是作用域不一样,所以不冲突,但是不建议大家这样写。
Previous: void方法return
Next: 参数