事件是委托的实例呢?还是:事件也是一个类呢?
我想问,本质上,事件是类还是对象。对于委托,它是类,不是对象。
但是事件呢?本质上是类,还是对象呢?

解决方案 »

  1.   

    event都可以通过delegate来完成。
    event强调了事件。通过订阅事件来获得通知
    delegate则泛指符合某种格式的函数
    C# 中的委托和事件
      

  2.   


    定义一个“public event {事件类型} {事件实例};” 的时候,你声明了一个实例(因此你不需要写new代码来创建这个实例),此时当然也使用了事件的类型。实际上这里的{事件类型}就是一种委托。
      

  3.   

    sorry,可能有一个误会:   “你声明了一个实例”   应该写为   “你声明了一个变量”。
      

  4.   


    我不知道“本质”这个词是不是太夸张了。这没有什么本质不本质的,因为实在是非常简单的语法糖。比如有人说他自定义个TextBox控件类型中定义了一个事件名叫“网警正在翻看信息”用于提醒使用者一些事情,那么这个事件在类型定义中就跟你的属性、字段一样,也不过是个变量。它实际上你可以简单地定义为delegate,这样别人使用这个TextBox实例(比如变量a)时不但可以直接针对a的这个事件使用
       a.网警正在放看信息 += .....
    的方式注册自己的事件处理方法,可以像任何字段、属性一样地随便改变它(重新赋值,而不仅仅是使用delegate的+=、-=方法)。但是如果你定一个event关键字,那么编译器就不允许别人胡乱使用它,而只能使用+=、-=两个方法来使用它。
      

  5.   

    事件其实就是一个特殊的委托。
    MSDN中是这样描述事件的:
    事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法。
    对于这一点,我们也可以从事件的定义中看出,不过就是在定义委托对象时加了event关键字表明这个委托现在叫事件。
    -------------------------------
    这应该比较权威了吧。
      

  6.   

    事件不是类,也不是委托实例,而是一个方法。这个方法太特别,以至于C#专门引入“事件”这个概念来指称它。事件的职责就是将委托串联在一起。一个事件背后通常会有一个委托类型的变量,但是通过自己编写 add/remove 访问器,你可以改变这个模式。事件是一个方法,也意味着,你可以用 virtual, abstract 这样的关键字来修饰它。但是这个视角非常的别扭,反正我在处理 Button.Click 时是不会想到这些的
      

  7.   

    用delegate声明的委托其实是类型, 事件其实是委托的实例,基于委托链实现的