事件
1,定义和使用事件的流程,如下图:
2,定义事件参数要继承EventArgs,定义事件使用public event EventHandler<CatCryEventArgs> CatCryEvent;
3,事件使用了观察者模式,有发布,订阅和通知
代码
/// <summary>
/// 利用委托来声明事件
/// </summary>
public event EventHandler ChangedEvent;
/// <summary>
/// 定义事件
/// </summary>
/// <param name="e">EventArgs</param>
protected virtual void OnHandleEvent(EventArgs e)
{
if (ChangedEvent != null)
{
ChangedEvent(this, e);
}
}
/// <summary>
/// 引发事件
/// </summary>
/// <param name="MotionEvent">MotionEvent</param>
/// <param name="prj">Project</param>
public void RaiseEvent()
{
OnHandleEvent(new EventArgs());
}
/// <summary>
/// 订阅事件
/// </summary>
/// <param name="evenSource">Project</param>
public void Subscribe(Project evenSource)
{
evenSource.ChangedEvent += new EventHandler(Pj_ChangedEvent);
}
/// <summary>
/// 执行事件
/// </summary>
private void Pj_ChangedEvent(object sender, EventArgs e)
{
//逻辑操作
}
委托和事件的关系
联系:
1,事件是基于委托实现的,可以通俗地理解为:事件是一种特殊的委托,特殊的地方在于它定义的是一个有两个参数(事件源和事件参数)没有返回值的委托。
2,当事件的订阅者订阅事件时,本质上是将事件的处理方法加入到委托链中,当事件触发时,委托链中的所有事件处理方法都会被调用。
区别:
委托本质是一种自定义类型(class),而事件本质是一个特殊的委托实例(对象)。