wbfans

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

委托(delegate)


委托声明定义了一种类型,它用一组特定的参数以及返回类型来封闭方法。对于静态方法,委托对象
封装要调用的方法。对于实例方法,委托对象同时封闭一个实例和该实例上的一个方法。如果您有一
个委托对象和一组适当的参数,则可以用这些参数调用该委托。

委托提供了类似于c++中函数指针的功能,简单的说委托类型就是面向对象函数指针。
不过c++的函数指针只能指向静态的方法,而委托除了可以指向一个静态的函数方法外,还可以指
向对象的实例的方法。而最大的差异在于委托是完全的面向对象,且使用安全的类型,另外委托允许程序员在程序执行时传入
方法的名称,动态的决定预调用的方法。如此的弹性更能让程序员随心所欲的发挥。

委托的本质是一个类,任何可以声明类的地方都可以使用委托。

委托的使用举例

using System;
delegate void EatDelegate(string food);//委托的声明,返回值及形参要与所指向的函数对应
class MyDelegate
{
 static void zsEat(string food)
 {
  Console.WriteLine("zs eat "+food);
 }
 static void lsEat(string food)
 {
  Console.WriteLine("ls eat "+food);
 }
 static void wwEat(string food)
 {
  Console.WriteLine("ww eat "+food);
 }
 static void Main()
 {
  EatDelegate zs=new EatDelegate(zsEat);
  EatDelegate ls=new EatDelegate(lsEat);
  EatDelegate ww=new EatDelegate(wwEat);
  //方法一
  zs("apple");
  Console.WriteLine("--------------");
  //方法二
  EatDelegate eatChain;
  eatChain=zs+ls+ww;
  eatChain("orange");
  Console.WriteLine("--------------");
  //方法三
  eatChain-=zs;//??zs???
  eatChain("banana");
  Console.WriteLine("--------------");
  //方法四
  eatChain+=zs;//???zs???
  eatChain("banana");
  Console.WriteLine("--------------");
  //方法五,匿名方法
  /*
   * EatDelegate eatChain=null;
   * eatChain+=delegate(string food){console.writeLine("zs eat "+food);};
   * eatChain("pear");
   */
 }
}

posted on 2011-08-13 16:36  wbfans  阅读(296)  评论(0编辑  收藏  举报