c# - lambda在这里的最后一个函数有什么用?

标签 c# lambda

我正在尝试理解 Lambda 表达式;

我有一个基本函数 Sq1,它是 i 的平方 我可以用 lambda 重写它以将它连成一行,Sq2

我也可以像 Sq4 那样用 Func<> 编写它,但我不确定为什么要这样做

此外,对于 Sq3,我试图编写 Sq4 的长手版,因为编写 Sq1 帮助我理解了 Sq2 实际上是在做

   public int Sq1(int i)
    {
        return i * i;
    }

    public int Sq2(int i) => i * i;

    public Func<int, int> Sq3(int i)
    {
        // Not sure what goes here, I don't want to return a function?
    }

    public Func<int, int> Sq4 = x => x * x;

谁能帮我理解为什么我要按照 Sq4 编写函数以及这实际上是什么简写?

最佳答案

Sq1Sq2相同函数,而不是 lambda。 Sq2使用 expression body syntax这允许简化简单的方法。 Sq2本质上是:

public int Sq2(int i) {
    return  i * i;
}

您可以使用 Sharplab.io查看两种情况下生成的代码。你会看到这两种方法的主体是相同的

你不能制作 Sq3函数表现得像Sq4 ,因为 Sq4另一方面是一个 Func 类型的字段,它包含 x => x * x代表。 Sq3另一方面是一个返回 Func 的函数,函数式编程中的常见习语。

您可以使用 Sq4就好像它是一个函数,例如:

var result=Sq4(2);

至于Sq3,你做什么取决于你想做什么。如果只想执行该函数,请使用与 Sq1 相同的语法或 Sq2 .如果你真的想返回一个 Func<>你可以使用这样的东西:

public Func<int,int> Sq3F()
{
    return (int i)=>i*i;
}

然后像这样使用它:

var fun=Sq3F();
var result=fun(4);

为什么是 Func<>?

在您意识到可以将函数 作为参数传递并动态构造复杂的转换之前,这看起来并不多,例如:

public Func<int,double> LogF(Func<int,int> fun)
{
    return (int i)=>Math.Log(fun(i));
}

...

var func=LogF(Sq3F());
var result=func(4);

另一种常用技术是 partial application - 采用一个具有多个参数的函数并生成另一个其中一些参数是固定的。假设您想创建一个适用于特定 基的单参数 Log 方法,这意味着您不能只使用`Math.Log(double,double)。你可以这样做:

public Func<double,double> LogN(double N)
{
    return (double d)=>Math.Log(d,N);
}

...

var log5F=LogN(5);
var result=log5F(5);

关于c# - lambda在这里的最后一个函数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58093820/

相关文章:

c# - 在 ASP.NET 中向用户显示预期的错误

没有 .pdb 文件的 C# 分析失败

c# - 在使用/父项目中指定用于类库的 log4net 配置

ruby - 在 Ruby 中,如果我在循环内声明一个 lambda 函数,它会在每次迭代后正确清理吗?

c# - Linq 表达式。相当于大于字符串

c# - 在 asp.net web api 中使用 MemoryStream 和 ZipArchive 将 zip 文件返回给客户端

c# - 如何在 vb.net 中使用 BackgroundWorker 将代码包装在 lambda 表达式中?

python - 我们可以从 AWS Lambda 访问所有账户堆栈及其信息吗?

Ruby 函数与方法

c# - 使用 char 值与 C# 中的变量名进行比较?