都是匿名的方式联定义?(Are anonymous methods defined inline?)

2019-10-18 06:41发布

都是匿名的方式联定义? 在下面的例子中,委托对象“d”是具有一个匿名方法,它正在访问的参考的“x”,这是在娱乐方法定义的变量。 的范围的“X”应仅限于娱乐的方法,但是当我们调用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();
}

Answer 1:

都是匿名的方式联定义?

我不知道什么是“内联”的意思。

在下面的例子中,委托对象“d”是具有一个匿名方法,它正在访问的参考的“x”,这是在德尔方法定义的变量。

不, x在定义Fun方法。 Del不是方法,这是一个委托类型。

“x”的范围应限于玩转方法。

正确。 回想一下,“在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();
}


Answer 2:

这就是所谓的封闭 。 它捕获x ,一旦执行委托使用它。 它是通过一些编译器魔法造成的。

它可有时混乱,虽然。 举例来说,如果你改变x定义的委托后,将使用该变化值。



文章来源: Are anonymous methods defined inline?