我还没有真正掌握创建和使用lambda表达式的方法.我知道如何在linq语句中使用它们,但我真的不明白幕后发生了什么.我还没能找到关于何时使用它们,如何定义它们等的完整教程.
第二部分...
他们说Javascript是一种LAMBDA语言,我对javascript非常了解,只是想知道哪些类型的概念适用于javascript lambdas和c#lambdas.
第三部分......
函数式语言和lambda语言有什么区别?
有什么建议?
让我向您介绍一下幕后发生的事情.它比你想象的要简单明了.
假设你有:
delegate int D(int x);
...
class C
{
void M(int y)
{
int z = 123;
D d = x=>x+y+z;
Console.WriteLine(d(10));
z = 345;
y = 789;
Console.WriteLine(d(10));
}
}
Run Code Online (Sandbox Code Playgroud)
所有编译器都假装你写的:
delegate int D(int x);
...
class C
{
private class Locals
{
public int y;
public int z;
public int A(int x)
{
return x + this.y + this.z;
}
}
void M(int y)
{
// Initialize the closure class:
Locals locals = new Locals();
locals.y = y;
// Transform the body so that all usages of y, z and the lambda
// refer to the closure class:
locals.z = 123;
D d = locals.A;
Console.WriteLine(d(10)); // Calls locals.A(10)
locals.z = 345;
locals.y = 789;
Console.WriteLine(d(10)); // Calls locals.A(10)
}
}
Run Code Online (Sandbox Code Playgroud)
这里的所有都是它的.lambda只是一个紧凑的语法,用于编写"将lambda使用的所有外部局部变量提升到一个类中,使用给定的主体在类上创建一个方法,并使我成为该方法的委托".
JScript中的函数闭包工作方式基本相同.JScript当然不是基于类的语言,所以细节略有不同,但想法是一样的.在C#中,新创建的委托对象跟踪具有变量状态的locals类.在JScript中,新创建的函数对象具有对创建闭包的函数的激活框的引用,这基本上是相同的信息.
lambdas转换为表达式树的方式是相当不同的,但这至少应该让你开始理解lambdas的概念.
我不能回答第三部分,但让我在1和2挥杆,也许这将帮助你3.
你了解代表吗?因为那真的是你所要处理的.VS2010 文档非常简洁.
在根目录下,lambda只是一个传递给委托声明的匿名函数.或者,更简单的方法是没有签名(返回类型,名称和参数).签名由使用暗示.
询问"何时使用lambda"实际上是在问"什么时候我应该为委托使用匿名函数",实际上,我想不出更好的场景,而不是LINQ使用它们作为示例.AFAIK并且理解,Javascript是一种lambda语言,因为你可以像变量一样传递方法,并使用匿名方法,而不仅仅是声明的方法.
至于阅读lambda,我不喜欢某些人使用的"转到"术语.我倾向于像普通方法一样阅读它,也就是说:
"给定一些参数列表,执行此代码"
因此,row => row.State =="NY"表示"给定行,当行的状态为纽约时返回true".
也许我过于简单了,但我是一个简单的人.