gpt4 book ai didi

c# - 匿名方法是内联定义的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:41 26 4
gpt4 key购买 nike

匿名方法是内联定义的吗?在下面的示例中,委托(delegate)对象“d”引用了一个匿名方法,该方法正在访问在 Fun 方法中定义的“x”变量。 “x”的范围应该限制在 Fun 方法中,但是当我们调用 MyFun 时,它会调用作为参数传递的委托(delegate)并增加“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();
}

最佳答案

Are anonymous methods defined inline?

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

In the example below, the delegate object "d" is having reference of an anonymous method, which is accessing "x" variable which is defined in the Del method.

不,x 是在Fun 方法中定义的。 Del 不是方法,它是委托(delegate)类型。

The scope of "x" should be limited to Fun method.

正确。回想一下,“x 的范围”被定义为“可以通过其非限定名称查找 x 的程序文本区域”。您正确使用了该术语; Fun 的主体是 x 的范围。请注意,匿名方法在 Fun 内,因此 x 在范围内。

when we call MyFun, it invokes the delegate passed as parameter and increments the value of "x".

正确。

The output comes out to be "6".

正确。

how does this happen ?

这个问题不是很清楚。听起来您已经解释了这是如何发生的:变量 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();
}

关于c# - 匿名方法是内联定义的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17110097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com