hoho,要求好高啊。这个还是找本好书看看吧!
我个人的理解,委托就是C中间的函数指针,C++中间也沿用了这一概念,但是因为OO的加入,使得C++中的函数指针与C中的函数指针有了一点区别,感觉使用起来很别扭,而且让人不好理解(你可以找相应的例子比较一下).估计microsoft也感觉到了,所以加入了delegate的概念,取代函数指针。
至于event,我开始感觉毫无作用,不过据说是为了兼容VB这种没有函数指针概念的.NET语言而加入的keyword。
我也就知道这些了,希望各位老大指点一下event还有什么作用。

解决方案 »

  1.   

    在.NET中,委托和事件是直接相关的.如果你有C++的基础,就不难理解委托的作用,委托要达到的目的基本上同C++中的函数指针是一样的,只是委托是类型安全,具有保护机制的---不会指向一个无效的地址.委托主要有两个应用:回调和事件处理.事件是通过委托来定义的,定义事件之前要有相应的委托,处理事件的委托有严格规定:1, 必须有两个参数,2.第一个参数是一对象,表示是谁引发的事件,第二个参数是从EventArgs派生的类,它包括了处理事件时所需要的信息.
    比如定义一个Click事件:public delegate void EventHandler (obj o, EevntArsg);public event EventHandler SimpleEvent;
    这样就定义了一个SimpleEvent事件,下面为事件添加处理函数:
    SimpleEvent += new EventHandler(OnSimpleEvent);
    void OnSimpleEvent(object o, EventArsg e)
    { ...
    }
      

  2.   

    比如一个button被点击,就产生一个click事件(windows向消息循环添加的新的事件)
    而这个(确切的说应该是这种)事件由什么函数来处理,则需要使用委托(代理)指定
    不知道这样的语句楼主注意过没有
    this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
    他说明btnExit.Click事件指定btnExit_Click函数处理,这里的委托是System.EventHandler
    private void btnExit_Click(object sender, System.EventArgs e)
    {
    Application.Exit();
    }
      

  3.   

    to :haiwangstar(八月桂花香)
    根据你所说的,一个event(如SimpleEvent)应该保证他的参数格式如下:
    public delegate void EventHandler (obj o, EevntArsg);可是我看书中Begining C#(C#入门经典)P260页的sample.其中delegate:
    public delegate void MessageHandle(string text);
    public event MessageHandler MessageArrived;
    并没有完全按照你所说的规则定义,给我的感觉,这个关键字event好象没有作用一样,因为程序中把这个event去掉一样可以运行.望:八月和其他高手解答我的疑惑.
    谢谢楼主问了一个好问题.
      
     
      

  4.   

    我是这样理解委托(代理)和事件的:
       委托其实就是一个对象,一个和他的参数与返回相匹配的的方法的引用,如:
       在类A中有方法:   public void add(int x , int y)
                    {
                      //........
                     }
                   public void sub(int w, int y)
                    { 
                       //..........
                    }
        那么可以申明委托是:
           delegate  public void dg1 (int a,int b);
       在另一个类 B 的另一个方法中可以实例化委托dg1,将他引用add或和sub方法,并调用这 个委托所引用的方法,让类 A 实例化后去执行相应的方法
       
     事件也是委托,也是申明和方法匹配的委托:只是参数严格要求了的,如下:
           public void method(object sender ,myEventArgs arg) 
                         //myEventArgs是自定义类,继承System.EventArgs
                     {
                          //..........
                      }
     委托是: delegate public void dg2(object sender ,myEventArgs arg );
      
     只是在申明事件时是:
          public event dg2 newEvent; //使用了event关键字
     然后在其他方法中调用该事件         
       我越来月觉得委托和事件除了声名时不同,没有多大区别了
      
    我对委托和事件的理解还很片面,有不对的地方,请大家提出来讨论,谢谢!
      

  5.   

    TO  turnmissile(会翻跟头的导弹):我是这样理解:本质上,事件实际就是代表,它指向一个处理该事件的方法.区别在于:代表是一个原型,规定了一种处理函数的原型.而事件是实实在在的一个代表的实例化.比如.net中的EventHandler这个代表很常用,在.net中 Form类的Activated,Closed 等好多事件都是用EventHandler这个代表来定义的,如果不定义事件,直接用代表,可能也可以工作,但是那样我们怎么样去区分每个不同的事件!关于事件处理函数的参数问题,我们从.NET库中可以看到凡是类的事件处理成员函数,参数只有一个,就是一个从EventArgs派生的类,因为类本身有一个this指针,所以object参数是不需要的;而在类外为一个类添加事件处理函数,必须是两个参数,如果是一个,那么我们就无法知道,究竟是哪一个对象触发了这个事件!(刚刚接触C#时,把delegate译为代表,现在也不习惯用委托这个词)
    意见不见的正确,欢迎高手发表高见..
      

  6.   

    to 桂花香兄:
        嘿嘿!在我看来,delegate已经确定了指向的function的类型,包括参数和返回值。而event的作用到现在为止看到的只是定义这是event,似乎只是告诉我们这些写代码的人这是个event,可是对于编译器,似乎没有起到什么作用,由他没它对于编译的结果没有什么影响。
    所以,我最想知道的是:在加了keyword event的delegate和没有这个keyword的有什么区别
      

  7.   

    TO turnmissile(会翻跟头的导弹)兄:呵.. 确实没什么本质的区别.就像你说的,好像event只是一个标记,告诉编译器,这个代表指向一个处理事件的函数,而不是回调或其它!仅此而已.
      

  8.   

    delegate是一种方法格式签名。
    event 可以认为是托管的一个方法入口地址列表。
    而通常的定义
    event aaaa  bbbb;
    这种定义也就是定义了一个名为bbbb的托管方法入口地址列表,并且要求
    这个地址列表中的所有方法都具有aaaa这个delegate规定的调用签名而已。而程序在运行时,当发生某种事件时,会去检查相应的入口地址列表,逐个执行
    里面的方法。这是我的理解。
      

  9.   

    我昨天又尝试看看event是否能够修饰任何种类的delegate,结果都可以
    然后我有猜测它是产生一个thread,结果还是完全一样。如阿亮所说,是先有事件ID,然后再根据事件类型查找入口。可是就我所知,我们早就知道我们event定义的时间指针对象,即楼上的那个bbbb。那么编译器为什么不直接把事件入口定位bbbb,至于bbbb之后指向的地址,由runtime来决定,何必再在发生的时候查找这个列表呢?还是有点迷惑
      

  10.   

    感觉event其实就是delegate类型属性和普通类型属性的get,set不同它可以add(+=),remove(-=)。
      

  11.   

    楼主啊,如果懒得去研究C++的函数指针和JAVA的反射的话;你直接把委托理解成对函数的引用就行了,照样用,没有什么特别的。
      

  12.   

    回复人: turnmissile(会翻跟头的导弹) ( ) 信誉:100  2004-01-07 09:59:00  得分:0 
     
     
      我昨天又尝试看看event是否能够修饰任何种类的delegate,结果都可以
    然后我有猜测它是产生一个thread,结果还是完全一样。如阿亮所说,是先有事件ID,然后再根据事件类型查找入口。可是就我所知,我们早就知道我们event定义的时间指针对象,即楼上的那个bbbb。那么编译器为什么不直接把事件入口定位bbbb,至于bbbb之后指向的地址,由runtime来决定,何必再在发生的时候查找这个列表呢?还是有点迷惑
     
     
    你现在问的是为什么要动态绑定吧?
    可以考虑一下继承时候的情况啊。
      

  13.   

    to jiangpeng: 如果真的只是那么简单的冬冬,岂不是由他没有他都差不多?to 日上三竿:我不是讨论动态绑定,只是觉得使用没有理由要加上这么一个keyword哦。继承的时候也是一样啊,用delegate定义的那个函数指针对象就可以了。不需要维护一张消息表。
      

  14.   

    那个event 究竟是不是多余的
      

  15.   

    我跟儿子说说:))).严重同意: turnmissile(会翻跟头的导弹) 的意见