Bri*_*rij 1 .net c# delegates scope anonymous-function
匿名方法是否内联定义?在下面的示例中,委托对象"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();
}
Run Code Online (Sandbox Code Playgroud)
匿名方法是否内联定义?
我不知道"内联"是什么意思.
在下面的示例中,委托对象"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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |