C# 本地方法和lambda实现

概念: 本地函数是一种嵌套在另一成员中的类型的方法。 仅能从其包含成员中调用它们。

下面是本地方法最简单的一个demo:

public static int Show()
        {
            int c = NewMethod(); 
            return c;

            static int NewMethod()
            {
                #region 测试
                int a = 3;
                int b = 9;

                int c = a + b;
                #endregion
                return c;
            }
        }

本地函数语法

本地函数可使代码意图明确。 任何读取代码的人都可以看到,此方法不可调用,包含方法除外。 对于团队项目,它们也使得其他开发人员无法直接从类或结构中的其他位置错误调用此方法。

本地方法使用注意事项:

  1. 本地函数不能使用修饰符,因为都是私有的,包括访问修饰符(如 private 关键字)会生成编译器错误 CS0106"修饰符'private'对于此项无效"。

  2. 本地函数,本地方法一般放在方法的结尾

    private static string GetText(string path, string filename)
    {
    var reader = File.OpenText($"{AppendPathSeparator(path)}{filename}");
    var text = reader.ReadToEnd();
    return text;

      string AppendPathSeparator(string filepath)
      {
         return filepath.EndsWith(@"\") ? filepath : filepath + @"\";
      }
    

    }

本地函数与 Lambda 表达式

本地函数和 Lambda 非常相似。 但是,应该注意,从两者中选用一种的时机和条件其实是存在差别的。

让我们检查一下阶乘算法的本地函数实现和 lambda 表达式实现之间的差异。 下面是使用本地函数的版本:

public static int LocalFunctionFactorial(int n)

{

return nthFactorial(n);

int nthFactorial(int number) => number < 2

? 1

: number * nthFactorial(number - 1);

}

public static int LambdaFactorial(int n)

{

Func<int, int> nthFactorial = default(Func<int, int>);

nthFactorial = number => number < 2

? 1

: number * nthFactorial(number - 1);

return nthFactorial(n);

}

明确赋值

Lambda 表达式是在运行时声明和分配的对象。 若要使用 Lambda 表达式,需要对其进行明确赋值:必须声明要分配给它的 Action/Func 变量,并为其分配 Lambda 表达式。 请注意,LambdaFactorial 必须先声明和初始化 Lambda 表达式 nthFactorial,然后再对其进行定义。 否则,会导致分配前引用 nthFactorial 时出现编译时错误。

本地函数在编译时定义。 由于未将它们分配给变量,因此可以从范围内的任意代码位置引用它们;在第一个示例 LocalFunctionFactorial 中,我们可以在 return 语句的上方或下方声明本地函数,而不会触发任何编译器错误。

这些区别意味着使用本地函数创建递归算法会更轻松。 你可以声明和定义一个调用自身的本地函数。 必须声明 Lambda 表达式,赋给默认值,然后才能将其重新赋给引用相同 Lambda 表达式的主体。

int M()

{

int y;

LocalFunction();

return y;

void LocalFunction() => y = 0;

}

这段代码定义了一个名为LocalFunction()的方法,该方法使用lambda表达式定义了一个局部函数,并将其实现设为将变量y的值设为0。

等于如下:

void LocalFunction()

{

y = 0;

}

实现详细信息包括本地函数的闭包是作为 class 还是 struct 实现。 本地函数可能使用 struct,而 lambda 将始终使用 class

虽然本地函数对 lambda 表达式可能有点冗余,但实际上它们的目的和用法都不一样。 如果想要编写仅从上下文或其他方法中调用的函数,则使用本地函数更高效。

相关推荐
Q_19284999063 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏5 分钟前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
努力学习编程的伍大侠8 分钟前
基础排序算法
数据结构·c++·算法
XiaoLeisj36 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Jasmine_llq1 小时前
《 火星人 》
算法·青少年编程·c#
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot