【发布时间】:2017-11-19 13:51:32
【问题描述】:
在 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。为什么?
【问题讨论】:
-
@Rotem:不,他没有。
-
@Rotem - 这是一个委托声明。添加
()将调用ToString。 -
抱歉,没用过
Funcs,只是猜测:) -
+1 提出了一个很好的问题,问得很好。一个看似简单的问题如何突出语言/平台中难以理解的领域的绝佳示例。
-
一个(单播)委托实例可以指向实例方法或
static方法。当它表示一个实例方法时,委托持有 both 调用该方法的“目标”对象和方法信息。所以当你说del = I.ToString;时,del将持有对象I,这里是Int32(不可变值类型)。当您使用匿名函数del = () => I.ToString();时,编译器会创建一个方法static string xxx() { return I.ToString(); },而del对象会保存该生成的方法。