ASP.NET中包含和不包含委托的事件
在一些ASP.NET示例中,我看到事件与这样的委托一起使用,有时候没有像这样的代理 。
请解释!
所有事件都是委托类型(它们都inheritance自EventHandler
,它inheritance自Delegate
MulticastDelegate
)。 有时(或者我宁愿大部分时间都说),不需要为事件声明自己的自定义委托 。 只要符合事件的签名,您就可以使用现有的代理。 随着.NET Framework 2.0中EventHandler
的引入,对自定义事件委托的需求几乎消失了(只要您遵循框架的事件设计)。 所以,做以下事情:
// declare an event with a custom delegate type public delegate void MyCustomEventHandler(object sender, EventArgs e); public event MyCustomEventHandler SomeCustomEvent;
……相当于:
// declare an event with an existing delegate type public event EventHandler SomeCustomEvent;
如果您有一些自定义的EventArgs
类,您可以使用通用的EventHandler
来表示您的事件:
class MyCustomEventArgs : EventArgs { // you custom stuff here } public event EventHandler SomeCustomEvent;
如果您订阅了由其他人创建的事件(您的asp.net页面或某些asp.net Web控件),则无需指定委托。 只需提供与委托签名匹配的方法即可。
创建活动的人必须提供代表。 订户只提供该方法。
ASP.NET增加了混乱,因为如果在页面定义中指定AutoEventWireup="true"
,它将在编译期间为您“连接”事件。
.NET中的事件由代理实现。 从您的第一个链接的页面:
事件使类中的对象能够通知其他对象发生了他们可能应对的事情。 [.NET]中的事件基于发布者 – 订阅者模型。 实现事件的类称为该事件的发布者。 订阅者类可以通过向已发布的事件注册适当的事件处理程序来订阅已发布的事件。
…
Delegate类型确定可以向事件注册的事件处理程序的签名。
因此,发布类定义了订阅类必须实现的委托。 引发事件时,将通过委托调用订阅类的方法。 处理事件的方法称为事件处理程序。 事件是发布事件的类的属性。 关键字事件旨在维护发布/订阅习惯用法。