C#3.0中匿名方法的闭包

C#3.0中匿名方法的闭包,c#,c#-3.0,closures,anonymous-methods,anonymous,C#,C# 3.0,Closures,Anonymous Methods,Anonymous,为什么匿名方法存在闭包?为什么不直接将状态传递到方法中,而不产生新类的开销,同时复制闭包变量呢?这不就是“让一切全球化”的倒退吗 有人对我说不,我觉得我在这里遗漏了什么…创建一个新类的开销可能不需要担心。对于CLR来说,这只是使绑定变量(闭包捕获的变量)在堆上可用的一种方便方法。它们仍然只能在闭包的范围内访问,因此它们根本不是传统意义上的“全局” 我相信它们的存在主要是为了方便程序员。事实上,就我而言,这是纯粹的。在闭包出现在C#之前,您可以很好地模拟闭包的行为,但是您没有得到C#3.0提供的任

为什么匿名方法存在闭包?为什么不直接将状态传递到方法中,而不产生新类的开销,同时复制闭包变量呢?这不就是“让一切全球化”的倒退吗


有人对我说不,我觉得我在这里遗漏了什么…

创建一个新类的开销可能不需要担心。对于CLR来说,这只是使绑定变量(闭包捕获的变量)在堆上可用的一种方便方法。它们仍然只能在闭包的范围内访问,因此它们根本不是传统意义上的“全局”


我相信它们的存在主要是为了方便程序员。事实上,就我而言,这是纯粹的。在闭包出现在C#之前,您可以很好地模拟闭包的行为,但是您没有得到C#3.0提供的任何简单性和语法上的好处。闭包的全部要点是不需要将父作用域中的变量传递给函数,因为它们是自动绑定的。如果程序员认为替代方案是真正的全局变量,则更容易和更干净,

,因为CLR处理它,最简单的“将状态传递到方法”的方法是自动生成一个类,它封装了这种状态。

至少有一种想法是闭包存在于其他语言中,比如javascript。因此,它们可能包括闭包,以符合人们以前使用匿名方法的经验。

纯粹是为了方便。。。例如,在定义
谓词时,您不知道需要多少状态-请考虑:

List<int> data = new List<int> {1,2,3,4,5,6,7,8,9,10};
int min = int.Parse(Console.ReadLine()), max = int.Parse(Console.ReadLine());
List<int> filtered = data.FindAll(i => i >= min && i <= max);
我不知道你的情况,但我更喜欢有结尾的版本。。。尤其是当你考虑当你有多个上下文级别时会变得多么复杂。我想让编译器担心这件事


还要考虑您使用此类构造的频率,特别是对于LINQ:您不希望以任何其他方式来执行此操作…

因为您需要编写以下内容:

var divsor = [...]
for(int x = 0; x < 10000000; x++){
     source[x] = source[x] / divsor         
}
var divsor=[…]
对于(int x=0;x<10000000;x++){
源[x]=源[x]/divsor
}
很容易就变成这样

var divsor = [...]
Parallel.For(int x = 0; x < 10000000; x++, ()=> {
     source[x] = source[x] / divsor         
})
var divsor=[…]
Parallel.For(int x=0;x<10000000;x++,()=>{
源[x]=源[x]/divsor
})

有些方法需要特定的签名。例如:

public void set_name_on_click(string name)
{
    button.Click += (s,e) => { button.Text = name; };
}

完全关闭可以很好地解决这个问题。你真的不想弄乱匿名方法签名。

我的意思是CLR会处理它,因为当编译器生成类时,事实上它是一个类,负责传递这些变量,我想我不清楚。
public void set_name_on_click(string name)
{
    button.Click += (s,e) => { button.Text = name; };
}