A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗代势 中级黑马   /  2012-11-1 18:10  /  1635 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗代势 于 2012-11-24 13:59 编辑

谁能跟我讲讲委托delegate

3 个回复

倒序浏览
首先你要明白,现实生活中的委托也就是中介是什么意思!用一个人关于买书买饭的例子,来给你说一下。
首先我们假设要买书,但我们是通过书店或者网上,这个书店网上就相当于一个委托也就是中介。我们要通过买书的时候首先这个中介得存在(也就是1.定义一个Delegate函数数据结构),中介有了我们得知道中介是可以用来做那些事情的(定义Delegate将引用的静态方法或引用类实例及该类的实例方法),然后我们得找到这个能替我们解决问题的中介(3.Delegate数据变量指向实例方法),最后中介接到我们的问题之后就调用他们内部的渠道去解决问题(4.通过Delegate数据变量执行实例方法)而这整个过程做为调用方,委托的方法对我们来说是看不到的,我们不知道中介接到我们的问题之后,会执行那些方法去替我们解决问题。下面是我写的一个简单的例子:
  1. namespace 委托
  2. {
  3.     public delegate void MaiFan(String Name,String res);
  4.     public delegate void MaiShu(String Name, String res);//1.定义一个委托数据结构
  5.     class Program
  6.     {

  7.         public static void MiFan(String Name, String res)//2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法
  8.         {
  9.             Console.WriteLine("hello!{0}你要买的是{1},已经好了",Name,res);
  10.         }
  11.         public static void XiFan(String Name, String res)//创建要委托的静态方法
  12.         {
  13.             Console.WriteLine("hello!{0}你要买的是{1}已经好了", Name, res);
  14.         }
  15.         public static void JiaoZi(String Name, String res)//创建要委托的静态方法
  16.         {
  17.             Console.WriteLine("hello!{0}你要买的是{1},已经好了", Name, res);
  18.            
  19.         }
  20.         public static void YuWen(String Name, String res)//创建要委托的静态方法
  21.         {
  22.             Console.WriteLine("hello!{0}你要买的是{1},已经好了", Name, res);
  23.         }
  24.         public static void ShuXUe(String Name, String res)//创建要委托的静态方法
  25.         {
  26.             Console.WriteLine("hello!{0}你要买的是{1},已经好了", Name, res);
  27.         }
  28.         public static void WuLi(String Name, String res)//创建要委托的静态方法
  29.         {
  30.             Console.WriteLine("hello!{0}你要买的是{1},已经好了", Name, res);

  31.         }

  32.    

  33.         static void Main(string[] args)
  34.         {


  35.             MaiFan MF = null;
  36.             MaiShu MS = null;
  37.             while (true)
  38.             {
  39.                 Console.WriteLine("你要买书,还是买饭!请选1买饭,选2买书");
  40.                 int num = Convert.ToInt16(Console.ReadLine());

  41.                 if (num == 1)
  42.                 {
  43.                     Console.WriteLine("你好!请输入你的名字!");
  44.                     string name = Console.ReadLine();
  45.                     Console.WriteLine("请选择你要买饭的序号!米饭(1)希饭(2)饺子(3)");
  46.                     int nu = Convert.ToInt16(Console.ReadLine());
  47.                     switch (nu)
  48.                     {
  49.                         case 1:
  50.                             MF = MiFan;//3.Delegate委托数据变量指向实例方法
  51.                             MF(name,"自动生成的米饭");//4执行委托实例方法
  52.                             break;
  53.                         case 2:
  54.                             MF = XiFan;
  55.                             MF(name, "自动生成的希饭");
  56.                             break;
  57.                         case 3:
  58.                             MF = XiFan;
  59.                             MF(name, "自动生成的饺子");
  60.                             break;
  61.                         default: break;

  62.                     }

  63.                 }
  64.                 else
  65.                 {
  66.                     if (num == 2)
  67.                     {
  68.                         Console.WriteLine("你好!请输入你的名字!");
  69.                         string name = Console.ReadLine();
  70.                         Console.WriteLine("请选择你要买书的类型!语文(1)数学(2)物理(3)");
  71.                         int nu = Convert.ToInt16(Console.ReadLine());
  72.                         switch (nu)
  73.                         {
  74.                             case 1:
  75.                                 MS =YuWen;
  76.                                 MS(name, "自动生成的语文");
  77.                                 break;
  78.                             case 2:
  79.                                 MS = ShuXUe;
  80.                                 MS(name, "自动生成的数学");
  81.                                 break;
  82.                             case 3:
  83.                                 MS = WuLi;
  84.                                 MS(name, "自动生成的物理");
  85.                                 break;
  86.                             default: break;

  87.                         }

  88.                     }
  89.                     else
  90.                     {
  91.                         Console.WriteLine("您的选择不正确!");

  92.                     }
  93.                 }

  94.             }

  95.            
  96.         }
  97.     }
  98. }
复制代码
回复 使用道具 举报
  1. MSDN:
  2. 委托是一个类型,是一个定义签名的类型,即方法的返回值类型和参数列表类型。可以使用委托类型来声明一个变量,该变量可以引用与委托签名相同的所有方法。


  3. 委托仅仅是函数指针,那就是说,它能够引用函数。

  4. 那么,定义一个委托,也就等于定义一个函数指针,

  5. 那么,函数指针指向一些什么样的函数呢?

  6. 这就在定义委托的时候决定了,如:

  7. public delegate void ShowDelegate(int p);

  8. 这就定义了一个委托 ShowDelegate。他指向的函数的返回类型为:void,函数有 1 个参数,类型为 int 型。

  9. 委托可以用来调用函数,如:

  10.     ShowDelegate abc = new ShowDelegate(ShowHi);

  11.     abc(15);

  12. 也可以做为函数的参数。

  13. 但大多数委托的用途多用于事件上。

  14. 事件就是委托的实例:

  15. public event 委托名(xxxEventHandler) 事件名/实例名;

  16. 详细请看:

  17. http://www.cnblogs.com/finesite/articles/255884.html


  18. using System;

  19. public class TestDelegate
  20. {

  21.     public delegate void ShowDelegate(int p);

  22.     public static void ShowHi(int a)
  23.     {
  24.         Console.Write("Hi:{0}\n", a);
  25.     }

  26.     public static void ShowHello(int b)
  27.     {
  28.         Console.Write("Hello:{0}\n", b);
  29.     }

  30.     public static void HowShow(ShowDelegate pr)
  31.     {
  32.         int a = 10;
  33.         pr(a);
  34.     }

  35.     public static void Main()
  36.     {
  37.         HowShow(new ShowDelegate(ShowHello));

  38.         ShowDelegate abc = new ShowDelegate(ShowHi);

  39.         abc(15);
  40.     }

  41. }
复制代码
回复 使用道具 举报
谢谢!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马