在 C# 语言和 .NET 框架中,你能帮助我理解委托吗?
我试图检查一些代码,发现收到的结果出乎我的意料。这里是:
class Program
{
public static int I = 0;
static Func<string> del = new Func<string>(I.ToString);
static void Main(string[] args)
{
I = 10;
Console.WriteLine("{0}", del());
}
}
答案是 0,而不是 10。为什么呢?
原因如下:
您声明委托的方式直接指向ToString
static int 实例的方法。它是在创建时捕获的。
正如弗林德伯格在下面的评论中指出的那样,每个委托都有一个目标和要在目标上执行的方法。
在这种情况下,要执行的方法显然是ToString
方法。有趣的部分是执行该方法的实例:它是I
在创建时,这意味着委托没有使用I
获取要使用的实例,但它存储对实例本身的引用。
后来你改变了I
到不同的值,基本上是为其分配一个新实例。这不会神奇地改变委托中捕获的实例,为什么要这样做呢?
为了获得您期望的结果,您需要将委托更改为:
static Func<string> del = new Func<string>(() => I.ToString());
像这样,委托指向一个执行的匿名方法ToString
就目前的I
在执行委托时。
在这种情况下,要执行的方法是在声明委托的类中创建的匿名方法。该实例为 null,因为它是静态方法。
看一下编译器为委托的第二个版本生成的代码:
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}
正如你所看到的,这是一个正常的方法某物。在我们的例子中,它返回调用的结果ToString
在当前实例上I
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)