gpt4 book ai didi

c# - 我似乎无法理解 c# 中的 Lambdas

转载 作者:行者123 更新时间:2023-11-30 13:13:50 24 4
gpt4 key购买 nike

我还没有真正掌握如何创建和使用 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));
}
}

编译器所做的只是假装你写了:

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)

}
}

这就是它的全部。 lambda 只是一种紧凑的语法,用于编写“将 lambda 使用的所有外部局部变量提升到一个类中,在具有给定主体的类上创建一个方法,并使我成为该方法的委托(delegate)”。

JScript 中的函数闭包基本上以相同的方式工作。 JScript 当然不是基于类的语言,所以细节略有不同,但思想是一样的。在 C# 中,新创建的委托(delegate)对象跟踪具有变量状态的本地类。在 JScript 中,新创建的函数对象有一个对创建闭包的函数的激活帧的引用,这基本上是相同的信息。

lambda 转换为表达式树的方式非常不同,但这至少应该让您开始理解 lambda 的概念。

关于c# - 我似乎无法理解 c# 中的 Lambdas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com