是内联定义的匿名方法

本文关键字:方法 定义 | 更新日期: 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,则将使用该更改值。