纠结了一天才弄明白

初学《C#4.0完全参考手册》,在第15章的15.3.3在匿名方法中使用外部变量的示例程序中遇到一个小问题(程序是没有问题的)。

实例程序如下

View Code
 1 using System;
 2 
 3 
 4 namespace 练习
 5 {
 6     delegate int countit(int end);
 7     class Program
 8     {
 9         static int sd()
10         {
11             return 0;
12         }
13         static countit counter()
14         {
15             int sum =0;
16             countit ctobj = delegate(int end)
17             {
18                 for (int i = 0; i <= end; i++)
19                 {
20                     Console.WriteLine(i);
21                     sum += i;
22                 }
23 
24                 return sum;
25             };
26 
27             return ctobj;
28         }
29         static void Main()
30         {
31             countit count = counter();
32             int result;
33            
34 
35             result = count(3);
36             Console.WriteLine("Summation of 3 is" + result);
37             Console.WriteLine();
38             result = count(5);
39             Console.WriteLine("Summartion of 5 is" + result);
40         }
41 
42     }
43 }

 

自己之前的理解:

  • 首先申明一个含有end参数返回int的委托类型,接着在VarCapture类中定义的一个返回countit类型对象的静态方法,在该方法中有创建了一个与countit类型实例ctobj相关联的匿名方法,该匿名方法返回变量sum,counter方法返回实例ctobj。在Main方法中首先将counter方法委托给count,这时候我就觉得方法counter与count并不匹配,count接受int类型参数,返回int类型的值,而counter没有参数,返回countit类型实例ctobj。于是我就很郁闷地把这章前面讲委托的部分的内容又看了一遍,结果越看越觉得有问题,可是这段代码的运行是没有问题的。

今天早上到了实验室,又把这段程序拿出来研究了,忽然我发现Main函数的第一条语句countit cout=Counter();怎么会有括号呢?前面小节原话:在实例化委托时,只需要指定希望委托的方法的名称。当然,方法的签名必须与委托的声明语句中所定义的签名相匹配,否则会导致编译错误。

我好像忽然明白了些什么,上面的那句代码是将counter方法返回的一个与匿名方法相关联的对象ctobj赋予count。为了演示“局部变量被捕获可能会带来难以预料的后果”,就需要调用匿名方法外的局部变量,于是将匿名方法装在另一个方法中,而这个包含匿名方法的方法又得返回与匿名方法相关联的委托对象,从而能在Main函数中执行匿名方法。

目前只能理解这么多···

posted @ 2012-07-01 09:06  zscflying  阅读(162)  评论(0编辑  收藏  举报