在 C # 中使用委托

在 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为什么?

3212 次浏览

原因如下:

声明委托的方式直接指向静态 int 实例的 ToString方法。它是在创世之时被捕获的。

正如 flindberg 在下面的注释中指出的,每个委托都有一个目标和一个要在目标上执行的方法。

在这种情况下,要执行的方法显然是 ToString方法。有趣的部分是方法执行的实例: 它是创建时 I的实例,这意味着委托不使用 I来获取要使用的实例,而是存储对实例本身的引用。

之后,您将 I更改为一个不同的值,基本上是为它分配一个新实例。这并不能神奇地改变委托中捕获的实例,为什么要这样做呢?

为了得到预期的结果,您需要将委托更改为:

static Func<string> del = new Func<string>(() => I.ToString());

像这样,委托指向一个匿名方法,该方法在委托执行时在当前 I上执行 ToString

在这种情况下,要执行的方法是在声明委托的类中创建的匿名方法。该实例为空,因为它是一个静态方法。

查看编译器为委托的第二个版本生成的代码:

private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}

正如您所看到的,这是一个执行 什么东西的普通方法。在我们的示例中,它返回对 I的当前实例调用 ToString的结果。

您需要将 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());
}
}
}

我猜测是因为 int 是通过值而不是引用传递的,因此在创建委托时,它是当前值为“ I”(0)的方法 ToString 的委托。

C # 委托支持封装对象、实例和方法。委托声明定义从类 System 派生的类。授权。委托实例封装调用列表,该列表是一个或多个方法,每个方法都称为可调用实体。

学习更多的形式

Http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html