1) 什么是委托 delegate?
书曰:委托是一种数据结构,提供类似C++中函数指针的功能。
>>这么说来,看得似是而非。还是来点感性认识为好。2) 实例using system
namespace test
{
  public delegate string MyDelegate(string name);  // Line A
  public class Test
  {
    public static string FuncA(string name);       // Line B
      {
         return "A say hello to "+name;
      }
    public static string FuncB(string name);
      {
         return "B say hello to "+name;
      }
     
    public static void MethodA(MyDelegate Me)      // Line E
      {
         Console.WriteLine(Me("张三"));
      } 
   public static void Main()
      {
           MyDelegate a = new MyDelegate(FuncA);  //  Line C
           MyDelegate b = new MyDelegate(FuncB);  
           MethodA(a);                            // Line D
           MethodB(b);      }
  } }
从上面的例子看到,这段代码的目的是要在控制台上写出 
A say hello to 张三
B say hello to 张三但是,使用了代理,这个先进的东西以后,这个任务就被绕啊绕的,最后终于绕了出来。初步感觉使用代理几乎等效于脱裤子放屁。
姑且相信使用代理会在更复杂的应用环境里有点用处吧,让我们看看它是怎么绕的。3) 怎么绕的呢?
先看Line A,这里声明了一个代理MyDelegate,好像是个函数的形式,但没有函数定义,即函数体。这个“函数”有个string的参数并返回一个string。
然后,看到要定义一个类,叫Test,里面有两个函数叫FuncA和FuncB,看Line B。还有一个函数,叫MethodA,看样子,FuncA和FuncB是函数功能的实质所在。而MethodA的样子有点怪(Line E),它有个参数,类型居然是MyDelegate,不仅如此,它函数体内的代码也有点怪异,居然让标准函数WriteLine使用参数Me("张三"),其实这也没什么奇怪的,Me本来就返回一个字符串,可以充当这个参数的。最后看上面的这些铺垫都是怎么使用的。看Line C,在Main函数里把那个代理当场类来使,实例化了一个MyDelegate‘类型’的a,看Line D,这里把刚才的那个MyDelegate"类型"的实例a当参数传递给了MethodA。4) 为什么要这样绕呢
这样绕的作用,第一就是让代码更难读了。第二,就是在编程是,可以简单地用实例化类的样子,实例化代理,并给代理传递不同的函数,以实现一个方法样式,对付多种功能的不同函数。5) 需要注意什么呢
我们看到,Line C处,创建a时,把函数名作为参数来使,不需要括号,这更像变量而不像函数了。也许发明这个技术的老外的脑子更能处理这种弯弯绕吧。我们是凡人,就要小心了。同时我们还看到,FuncA分明需要参数,可FuncA本身作为参数传给“构造函数”MyDelegate时,没有带参数。可是,尽管没有带参数,那个参数name仍然神秘地让a知道了怎么处理它的参数“name”,回忆一下,在FuncA中,是这样的形式:    public static string FuncA(string name);       // Line B
      {
         return "A say hello to "+name;
      }
如果是一般的函数,没有那个name参数的话,CPU就会抓狂了。这里不然,这里是“代理”,咱得敬畏它一下。再看一下后面的Line E,这里把参数“张三”传了进去。也就是说,如果实例化MyDelegate对象时,没有参数传进,当用MethodA“调用”那个代理时,就在内部把FuncA需要的参数塞给了它,这里的参数就是“张三”。确实很弯弯绕啊。=========学习笔记完。希望网友们给予指导。

解决方案 »

  1.   

    暂时不忙结贴,让更多的人参与一下吧。另外,在BCB或Delphi里面,线程对象就是用类似的方式来进行同步的,看那个Synchronize()就知道了。
      

  2.   

    delegate主要是用它的异步调用功能,比如在form2中要调用form1中的函数就要用delegate了,还有所用的event也要用delegate,像你点个button什么的,都是用delegate来做的,你可以看看这个网站中的第四个方法,就是用delegate来做异步调用的。
    http://blog.csdn.net/tjvictor/archive/2006/06/23/824617.aspx
      

  3.   

    个人理解:
    1:只有和事件合用的delegate才叫委托
    2:委托不是为了完成一个实例,而是为了多个实例大共同触发条件