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

原因如下:

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

正如弗林德伯格在下面的评论中指出的那样,每个代表都有一个目标和一个要在目标上执行的方法。

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

稍后,您将I更改为一个不同的值,基本上分配给它一个新的实例。 这不会奇迹般地改变你的委托中捕获的实例,为什么呢?

为了得到你期望的结果,你需要改变这个委托:

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

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

在这种情况下,要执行的方法是在声明委托的类中创build的匿名方法。由于实例是静态方法,因此该实例为null。

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

 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传递给您的函数,以便可以在适当的时间(而不是在创build函数时I.ToString()执行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派生的类。 委托实例封装了一个调用列表,这个列表是一个或多个方法的列表,每个方法都被称为可调用实体。

学习更多的forms

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

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