纠结了一天才弄明白
初学《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函数中执行匿名方法。
目前只能理解这么多···