为什么C#EventHandler在MSN示例中等于事件?

为什么C#EventHandler在MSN示例中等于事件?,c#,events,publish-subscribe,C#,Events,Publish Subscribe,以下是MSN网站上的一个示例。这是一个很好的例子,我只是不明白这句话: EventHandler<CustomEventArgs> handler = RaiseCustomEvent; 事件对于委托类型的作用就像属性对于任何其他类型的作用一样 如果您有这样的财产: public string Name {get;set;} 显然,你可以这样做: string name = Name; 该属性具有由该属性访问/修改的基础字符串值 类似地,事件的引擎盖下有一个委托,该委托属于事件

以下是MSN网站上的一个示例。这是一个很好的例子,我只是不明白这句话:

EventHandler<CustomEventArgs> handler = RaiseCustomEvent;

事件对于委托类型的作用就像属性对于任何其他类型的作用一样

如果您有这样的财产:

public string Name {get;set;}
显然,你可以这样做:

string name = Name;
该属性具有由该属性访问/修改的基础字符串值

类似地,事件的引擎盖下有一个委托,该委托属于事件声明中定义的类型。它是一个事件只是定义了如何从底层委托添加/删除该事件的处理程序

从声明类型内部(这是一个关键点;您不能在外部执行此操作),您可以访问基础委托以调用它。这就是为什么要执行您看到的代码;他们正在访问底层委托,以便验证其中是否有一些处理程序,如果有,它将调用这些处理程序

因此,要明确回答这些问题:

RaiseCustomEvent
不是基于程序顶部定义的事件吗

RaiseCustomEvent
是事件包装的基础委托的类型

为什么事件等同于EventHandler?这是两种不同的类型

这不是严格的平等。它正在从事件中拉出底层委托

正在初始化的
RaiseCustomEvent
在哪里?如果未初始化,我们如何复制它,或者为什么要将未初始化的内容复制到其他内容

在本例中,它使用框架将提供的自动添加/删除实现,而不是手动定义它们。如果基础委托当前为空,则自动定义的添加处理程序将初始化该委托。如果事件声明 定义一个自定义
add
处理程序,它将需要处理该情况

那里的
处理程序
变量的作用是什么?这是一个事件还是一个事件处理程序


它是表示所有事件处理程序组合的单个委托。在它的定义中,将包含组成该委托的所有单个方法的调用列表。因此,它不是单个事件处理程序,而是所有事件处理程序的集合。因为它已经退出了该事件,它不再严格地代表该事件;这是过去某个时候发生的事情的复制品。您不能使用从中提取的委托来更改事件(即添加新的处理程序)。

事件对于委托类型的作用就像属性对于任何其他类型的作用一样

如果您有这样的财产:

public string Name {get;set;}
显然,你可以这样做:

string name = Name;
该属性具有由该属性访问/修改的基础字符串值

类似地,事件的引擎盖下有一个委托,该委托属于事件声明中定义的类型。它是一个事件只是定义了如何从底层委托添加/删除该事件的处理程序

从声明类型内部(这是一个关键点;您不能在外部执行此操作),您可以访问基础委托以调用它。这就是为什么要执行您看到的代码;他们正在访问底层委托,以便验证其中是否有一些处理程序,如果有,它将调用这些处理程序

因此,要明确回答这些问题:

RaiseCustomEvent
不是基于程序顶部定义的事件吗

RaiseCustomEvent
是事件包装的基础委托的类型

为什么事件等同于EventHandler?这是两种不同的类型

这不是严格的平等。它正在从事件中拉出底层委托

正在初始化的
RaiseCustomEvent
在哪里?如果未初始化,我们如何复制它,或者为什么要将未初始化的内容复制到其他内容

在本例中,它使用框架将提供的自动添加/删除实现,而不是手动定义它们。如果基础委托当前为空,则自动定义的添加处理程序将初始化该委托。如果事件声明 定义一个自定义
add
处理程序,它将需要处理该情况

那里的
处理程序
变量的作用是什么?这是一个事件还是一个事件处理程序


它是表示所有事件处理程序组合的单个委托。在它的定义中,将包含组成该委托的所有单个方法的调用列表。因此,它不是单个事件处理程序,而是所有事件处理程序的集合。因为它已经退出了该事件,它不再严格地代表该事件;这是过去某个时候发生的事情的复制品。您不能使用从中提取的委托更改事件(即添加新的处理程序)。

我将尝试您提出的四个问题:

1) RaiseCustomEvent不是基于程序顶部定义的事件吗

CustomEventArgs
类为我们要声明的事件保存一些数据(参数)。它用作类型中的类型参数。最后一个类型是委托类型,这意味着它表示具有相同签名和返回类型的一个或多个方法。(零方法将是一个
null
引用,作为委托的值。)

事件的类型是委托类型,
EventHandler

2) 为什么事件等同于EventHandler?这是两种不同的类型

事件由一对特殊方法、访问器、一个
add
访问器和一个
remove
访问器组成。两者都有一个相同类型的参数,称为事件类型。该类型必须是委托类型。在这种情况下,t