由匿名方法和lambdas保存的引用
本文关键字:保存 引用 lambdas 方法 | 更新日期: 2023-09-27 18:22:18
.NET 2.0或4.0编译器为匿名方法生成的代码与.NET 4.0编译器为等效lambda生成的代码中生成的引用有什么区别吗?特别是对于这个指针:我知道匿名方法和lambdas都是C#编译器的一个特性,编译器实际上生成了一个嵌套类,其中包含一个委托和外部变量所需的所有引用,但这篇关于匿名方法实现的文章指出,对指针保留了引用,我找不到任何描述lambdas类似内容的来源。。或者我没有发现任何东西,因为编译匿名方法的实现将1对1映射到lambdas的实现?
这里有一些代码来演示匿名方法和lambdas:
class AnonymousMethodMethodScope
{
private Func<bool> d;
public Func<int, bool> d2;
int j = 0;
public void Test(int i)
{
d = new Func<bool>(delegate { j = 10; return j > i; });
// what references does this anonymous method keep?
d2 = new Func<int, bool>(delegate(int x) { return x == j; });
Console.WriteLine("j = " + j + " result = " + d());
}
}
class LambdaMethodScope
{
private Func<bool> d;
public Func<int, bool> d2;
public void Test(int i)
{
int j = 0;
d = () => { j = 10; return j > i; };
// what references does this lambda keep?
d2 = x => x == j;
Console.WriteLine("j = " + j + " result = " + d());
}
}
是的,lambda表达式在捕获变量时将做(并且必须做)与匿名方法相同的事情。(我假设您谈论的是转换为委托的lambda表达式;如果它们转换为表达式树,它们可能会有点不同——我不确定。)