也谈.net平台的委托--扩展篇

回顾
    
上一篇主要描述了委托的概念以及.net平台的委托实现,这一边主要描述.net平台针对委托的几个扩展。

一、 委托推断 
     c#2.0版本中出现了委托推断,给委托传递方法地址时可以使用一种简洁的语法。
     eg:GetAString firstStringMethod = new GetAString(x.ToString); 
           只要用变量 x 把方法名传送给变量 firstStringMethod,就可以编写出作用相同的代码
           GetAString firstStringMethod = x.ToString; 
     *    编译器会用 firstStringMethod 检测需要的委托类型,因此创建 GetAString 委托类型的一个实例,用对象 x 把方法的地址传送给构造函数。 

二、 匿名方法
     有时候某些方法我们可能只需要在一个地方使用,这时候匿名方法允许我们直接将一个函数体传递给一个委托,从而简化掉了方法声明的步骤(不会提高程序效率)。

  
    
1 delegateTest anonDel = delegate ( string param)
2 {
3 param += mid;
4 param += " and this was added to the string. " ;
5 return param;
6 };

    注意事项:
    1. 在匿名方法中不能使用跳转语句跳到该匿名方法的外部,反之亦然:匿名方法外部的跳转语句不能跳到该匿名方法的内部。 
    2. 在匿名方法内部不能访问不安全的代码。另外,也不能访问在匿名方法外部使用的 ref和 out 参数。但可以使用在匿名方法外部定义的其他变量。 
    3. 如果需要用匿名方法多次编写同一个功能,就不要使用匿名方法。而编写一个指定的方法比较好,因为该方法只需编写一次,以后可通过名称引用它。  

三、 多播委托
     一个委托也可以包含多个方法,这种委托称为多播委托。
    如果调用多播委托,就可以按顺序连续调用多个方法。为此,委托的签名就必须返回 void;否则,就只能得到委托调用的最后一个方法的结果。
    *委托调用方法链的顺序并未正式定义,因此应避免编写依赖于以特定顺序调用方法的代码。

  
    
1 delegate void DoubleOp( double value);
2
3   class MainEntryPoint
4 {
5 static void Main()
6 {
7 DoubleOp operations = MathOperations.MultiplyByTwo;
8 operations += MathOperations.Square;
9 // 多播委托也可以识别-、-=。
10 // operations -= MathOperations.Square;
11 }
12 }

你可能感兴趣的:(.net)