lambda(或闭包)封装了函数指针和变量。这就是为什么在C#中可以执行以下操作的原因:
int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
return i < lessThan;
};
我在那里使用了一个匿名委托作为闭包(它的语法比lambda等效语言的语法更清晰,更接近C),它捕获了小于(堆栈变量)到闭包中。当评估闭包时,将继续引用小于(其堆栈框架可能已被破坏)。如果我更改小于,则更改比较:
int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
return i < lessThan;
};
lessThanTest(99);
lessThan = 10;
lessThanTest(99);
在C语言中,这将是非法的:
BOOL (*lessThanTest)(int);
int lessThan = 100;
lessThanTest = &LessThan;
BOOL LessThan(int i) {
return i < lessThan;
}
尽管我可以定义一个带有2个参数的函数指针:
int lessThan = 100;
BOOL (*lessThanTest)(int, int);
lessThanTest = &LessThan;
lessThanTest(99, lessThan);
lessThan = 10;
lessThanTest(100, lessThan);
BOOL LessThan(int i, int lessThan) {
return i < lessThan;
}
但是,现在我在评估它时必须传递两个参数。如果我希望将此函数指针传递给不在lessThan范围之外的另一个函数,则必须通过将其传递给链中的每个函数或将其提升为全局函数来手动使其保持活动状态。
尽管大多数支持闭包的主流语言都使用匿名函数,但并没有要求。您可以具有不带匿名函数的闭包,也可以不带闭包的匿名函数。
简介:闭包是函数指针+捕获变量的组合。