在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
静态INT实例的方法。 它在创建时被捕获。
如flindeberg在下面的评论所指出的,每个代表具有目标和方法要在目标执行。
在这种情况下,要执行的方法是明显的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
。
你需要通过I
给你的功能,使I.ToString()
可以在适当的时候(而不是在时间的函数创建)执行。
class Program
{
public static int I = 0;
static Func<int, string> del = num => num.ToString();
static void Main(string[] args)
{
I = 10;
Console.WriteLine("{0}", del(I));
}
}
下面是应该这样做:
using System;
namespace ConsoleApplication1
{
class Program
{
public static int I = 0;
static Func<string> del = new Func<string>(() => {
return I.ToString();
});
static void Main(string[] args)
{
I = 10;
Console.WriteLine("{0}", del());
}
}
}
C#代表启用同时封装的对象和实例和方法。 甲委托声明定义了从类System.Delegate派生的类。 一个代表实例封装了一个调用列表中,这是一个列表中的一个或多个方法,其中的每一个被称为可调用实体。
了解更多形式
http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html
我的猜测是因为INT由值不引用过去了,用于创建委托时的原因,这是一个授人以“I”的当前值的方法ToString(0)。