都是匿名的方式联定义? 在下面的例子中,委托对象“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();
}
都是匿名的方式联定义?
我不知道什么是“内联”的意思。
在下面的例子中,委托对象“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();
}
这就是所谓的封闭 。 它捕获x
,一旦执行委托使用它。 它是通过一些编译器魔法造成的。
它可有时混乱,虽然。 举例来说,如果你改变x
定义的委托后,将使用该变化值。