我正在尝试理解 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
编写函数以及这实际上是什么简写?
最佳答案
Sq1
和 Sq2
是相同函数,而不是 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/