什么是结束?我们在.NET有他们吗?
如果它们确实存在于.NET中,您能提供一个代码片段(最好是在C#中)来解释它吗?
发布于 2009-01-09 16:04:44
我有一篇关于这个主题的文章。(它有很多例子。)
从本质上说,闭包是一个代码块,可以在以后执行,但它维护最初创建它的环境--也就是说,即使在该方法完成执行之后,它仍然可以使用创建它的方法的局部变量等。
闭包的一般特性是通过匿名方法和lambda表达式在C#中实现的。
下面是一个使用匿名方法的示例:
using System;
class Test
{
static void Main()
{
Action action = CreateAction();
action();
action();
}
static Action CreateAction()
{
int counter = 0;
return delegate
{
// Yes, it could be done in one statement;
// but it is clearer like this.
counter++;
Console.WriteLine("counter={0}", counter);
};
}
}输出:
counter=1
counter=2在这里,我们可以看到,CreateAction返回的操作仍然可以访问计数器变量,并且确实可以增加它,即使CreateAction本身已经完成。
发布于 2011-08-22 03:47:08
如果您对C#如何实现闭包感兴趣,请阅读“我知道答案( 42)博客”
编译器在后台生成一个类来封装阳极方法和变量j。
[CompilerGenerated]
private sealed class <>c__DisplayClass2
{
public <>c__DisplayClass2();
public void <fillFunc>b__0()
{
Console.Write("{0} ", this.j);
}
public int j;
}职能方面:
static void fillFunc(int count) {
for (int i = 0; i < count; i++)
{
int j = i;
funcArr[i] = delegate()
{
Console.Write("{0} ", j);
};
}
}将其转化为:
private static void fillFunc(int count)
{
for (int i = 0; i < count; i++)
{
Program.<>c__DisplayClass1 class1 = new Program.<>c__DisplayClass1();
class1.j = i;
Program.funcArr[i] = new Func(class1.<fillFunc>b__0);
}
}发布于 2009-01-09 16:04:10
闭包是函数值,它从原来的作用域内保存变量值。C#可以以匿名委托的形式使用它们。
对于一个非常简单的例子,以下面的C#代码为例:
delegate int testDel();
static void Main(string[] args)
{
int foo = 4;
testDel myClosure = delegate()
{
return foo;
};
int bar = myClosure();
}在它的末尾,bar将被设置为4,myClosure委托可以传递到程序的其他地方使用。
闭包可以用于许多有用的事情,比如延迟执行或简化接口- LINQ主要是使用闭包构建的。对大多数开发人员来说,最直接的方法是向动态创建的控件中添加事件处理程序--您可以在控件实例化时使用闭包来添加行为,而不是将数据存储在其他地方。
https://stackoverflow.com/questions/428617
复制相似问题