关于event和delegate,我想很多像我这样的初学者都会有一些困惑,到底为什么会出现两个这么相近的东西。从语法上来讲,反复论证发现只有一个区别,可以说是对event的限制那就是1.event所声名的成员变量在类的外面使用时,"仅且只能" 出现在+=,-=的左边,其他和普通delegate相同。至于在网上出现的其他的所谓区别
1.event可以不用初始化
2.event所委托的方法不能有返回值关于1,其实delegate也可以不用初始化。
关于2,可以有返回值,只不过对于多个委托事件,只能返回最后一个事件的返回值,这一点感觉和多播委托没什么区别。希望大家可以做补充,和指正。

解决方案 »

  1.   

    1、event不用初始化应该这样理解,一个类的event成员相当于一个实例化好的委托。这一点很重要,这就是event为什么能作为接口成员,如果你用一个委托实例字段来代替event,这个字段是不能包含在接口中的,而如果用属性,则势必在子类中要实例化。event相对于delegate实例,语法上的区别不是太多,只能这么说,event借助delegate实现了事件机制,当然没有event关键字,我们也可以用delegate来建立事件机制……
      

  2.   

    to Ivony() "event不用初始化应该这样理解,一个类的event成员相当于一个实例化好的委托。"
    这句话我不能够接受,我的认为是,即使interface里面能够放置event,那也是event的特殊意义所决定的,而不是说它就已经实例好了,它放在interface里面,也只是一个特殊的property。如果你不给它实例化,它照样指向null的。
      

  3.   

    如果你不给它实例化,它照样指向null的。
    那是对内而言,对外你可以不实例化就能+=
      

  4.   

    对于委托好象是可以不用new来实例化,但我不知道这有什么差别?
    delegate int fp(int a,int b);class A
    {public void example()
       {fp fp1=+fn;
         //fp fp1=new fp(fn);
         //上面这两句应该是等效的吧?
        } private int fn(int a,int b){....};
     }
      

  5.   

    如果你不给它实例化,它照样指向null的。
    那是对内而言,对外你可以不实例化就能+=------------------如果说,不实例化就能+=,那下面这段程序怎么解释    delegate void MyDelegate();
        class MyClass
        {
            public MyDelegate myDelegate;
        }
        MyClass myClass = new MyClass();
        myClass.myDelegate += mycls_myDelegate;
        myClass.myDelegate();    void mycls_myDelegate()
        {
            MessageBox.Show("Test");
        }这只是一个delegate,这不是照样可以执行,和是不实例化有什么关系?
    还不都是编译器动的手脚。在这一点上,delegate和event没有区别另:我用的是2005,没用过2003,不知道是不是有区别
    但是为了不因为版本问题引起争论,特此声名。
      

  6.   

    怎麼說呢,這兩個是很相近,一般寫委托就用delegate,event更多用於系統的調用,比如你要將一個委托通過函數的形參傳送,你最好用event,雖然用delegate也行,但是windows都是用event來傳消息的。兩者的區別真的不好說,要在具體的例子中可能才能體現它們的不同。
      

  7.   

    嗯……我错了,委托的确可以在null的情况下进行+=操作,这倒是很奇怪。
    但是event可以作为接口成员这个特性倒是比较有用,如果用委托的话,势必要做成属性的。
    先吃饭,然后再对委托进行更多测试……
      

  8.   

    event 和 delegate 的关系有点象 Property和field的关系一样。
    你可以根据自己的需要重写event的 += 和 -= 方法,而对delegate不行。
    Jeffery richard的那本 .net框架设计里讲了一些
      

  9.   

    Ivony() ( ) 信誉:100    Blog  2006-11-24 19:59:13  得分: 0  
     
     
       
    嗯……我错了,委托的确可以在null的情况下进行+=操作,这倒是很奇怪。
    但是event可以作为接口成员这个特性倒是比较有用,如果用委托的话,势必要做成属性的。
    先吃饭,然后再对委托进行更多测试……  
     
    --------------------------------我前面也说过,其实,event就是一个特殊的property,因为如果不是自己去实现他的add和romove的话,那么这里面隐藏着一个基础数据保存字段(不知道这样说准不准确),也就是还有一个默认的,在代码期看不见的delegate呢。等编译了以后才能看的见。