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

相关推荐
likuolei8 小时前
XQuery 完整语法速查表(2025 最新版,XQuery 3.1)
xml·java·数据库
雨中飘荡的记忆8 小时前
LangChain4j 实战指南
java·langchain
okseekw8 小时前
Java 中的方法:从定义到重载的完整指南
java
雨中飘荡的记忆8 小时前
深入理解设计模式之适配器模式
java·设计模式
用户84913717547168 小时前
生产级故障排查实战:从制造 OOM 到 IDEA Profiler 深度破案
java·jvm
雨中飘荡的记忆8 小时前
深入理解设计模式之装饰者模式
java·设计模式
雨中飘荡的记忆8 小时前
秒杀系统设计与实现
java·redis·lua
我是唐青枫9 小时前
C#.NET 范围与索引(Range、Index)完全解析:语法、用法与最佳实践
c#·.net
小坏讲微服务9 小时前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发
老鼠只爱大米9 小时前
Java设计模式之外观模式(Facade)详解
java·设计模式·外观模式·facade·java设计模式