是内联定义的匿名方法
本文关键字:方法 定义 | 更新日期: 2023-09-27 18:18:38
匿名方法是否内联定义?在下面的例子中,委托对象"d"引用了一个匿名方法,该方法访问了Fun方法中定义的变量"x"。"x"的作用域应该局限于Fun方法,但是当我们调用MyFun时,它会调用作为参数传递的委托并增加"x"的值。
输出结果是"6",这是怎么发生的?"x"的值,或者首先是"x"变量本身如何在匿名方法中可用?
public delegate void Del();
public void Fun()
{
int x = 5;
Del d = delegate { x++; };
MyFun(d);
Console.WriteLine(x);
}
public static void MyFun(Del d)
{
d();
}
匿名方法是否内联定义?
我不知道"inline"是什么意思。
在下面的例子中,委托对象"d"引用了一个匿名方法,该方法访问Del方法中定义的变量"x"。
否,x
是在Fun
方法中定义的。Del
不是一个方法,它是一个委托类型
"x"的范围应该限制在Fun方法。
正确的。回想一下,"x的作用域"被定义为"程序文本中x可以通过其非限定名查找的区域"。你正确地使用了这个术语;Fun
的主体是x
的范围。请注意,匿名方法在Fun
内部,因此x
在范围内。
当我们调用MyFun时,它调用作为参数传递的委托并增加"x"的值。
正确的。
输出结果为"6"。
正确的。
这是怎么发生的?
这个问题不完全清楚。听起来好像您已经解释了这是如何发生的:变量x
在匿名函数内的作用域中,函数增加变量,因此变量的值发生了变化。
如果你的问题是"编译器生成什么代码来实现这个?"编译器假装你写了这样的东西:
public delegate void Del();
private class Locals
{
public int x;
public void AnonymousMethod() { x++; }
}
public void Fun()
{
Locals locals = new Locals();
locals.x = 5;
Del d = locals.AnonymousMethod;
MyFun(d);
Console.WriteLine(locals.x);
}
public static void MyFun(Del d)
{
d();
}
这叫做闭包。它捕获x
,并在执行委托时立即使用它。这是通过一些编译器的魔法完成的。
虽然有时会令人困惑。例如,如果在定义委托后更改x
,则将使用该更改值。