我似乎无法在c#中围绕Lambdas

Rod*_*son 3 c# lambda

我还没有真正掌握创建和使用lambda表达式的方法.我知道如何在linq语句中使用它们,但我真的不明白幕后发生了什么.我还没能找到关于何时使用它们,如何定义它们等的完整教程.

第二部分...

他们说Javascript是一种LAMBDA语言,我对javascript非常了解,只是想知道哪些类型的概念适用于javascript lambdas和c#lambdas.

第三部分......

函数式语言和lambda语言有什么区别?

有什么建议?

Eri*_*ert 8

让我向您介绍一下幕后发生的事情.它比你想象的要简单明了.

假设你有:

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的概念.

  • @Brian:它不是*更精确*,它是*不正确*.闭包捕获*整个变量*,而不是*创建闭包时的值*.没有更多的局部变量z; 它完全消失*.如果z在M中的lambda之外的某处使用,则z也变为locals.z.*lambda对z的状态所做的更改在lambda*之外是可见的.再一次,让我重复一遍,以确保它是清楚的:闭包捕获**变量**,而不是**它的值**.许多人在这一点上感到困惑. (3认同)

Jim*_*m L 5

我不能回答第三部分,但让我在1和2挥杆,也许这将帮助你3.

你了解代表吗?因为那真的是你所要处理的.VS2010 文档非常简洁.

在根目录下,lambda只是一个传递给委托声明的匿名函数.或者,更简单的方法是没有签名(返回类型,名称和参数).签名由使用暗示.

询问"何时使用lambda"实际上是在问"什么时候我应该为委托使用匿名函数",实际上,我想不出更好的场景,而不是LINQ使用它们作为示例.AFAIK并且理解,Javascript是一种lambda语言,因为你可以像变量一样传递方法,并使用匿名方法,而不仅仅是声明的方法.

至于阅读lambda,我不喜欢某些人使用的"转到"术语.我倾向于像普通方法一样阅读它,也就是说:

"给定一些参数列表,执行此代码"

因此,row => row.State =="NY"表示"给定行,当行的状态为纽约时返回true".

也许我过于简单了,但我是一个简单的人.