本地函数

本地函数英文叫:Local Functions,是C# 7.0以后才有的

前面我们学习了方法的调用,方法代码块内可以调用其他方法:

  • 类内部的方法:直接写方法名传参调用;
  • 跨类方法:需要先创建对应类的实例对象,且目标方法必须标记 public

C# 7.0 开始,支持在一个方法内部直接定义独立函数,称为本地函数

  1. 隔离性:仅能在包裹它的外层方法内部调用,外部代码无法访问;
  2. 优势:代码逻辑收拢、可读性更高、维护更简单;
  3. 声明规则:和局部变量不同,本地函数可以在外层方法任意位置定义,无需提前声明。

本地函数可捕获外层方法的局部变量,仅作用域局限于包裹方法内。


先补充一个知识点:

函数内部的局部变量,从上往下执行,局部变量需要先声明,后才可以使用,不能反过来。

例如下面代码: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,原因是作用域不一样,所以不冲突,但是不建议大家这样写。

Next:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注