C# 菜鸟学习事件与委托
这是在项目中碰到的事例:
public delegate void GetSMSCodeHandler(object sender, MsgCodeErrorEventArgs args);
public delegate Task<bool> GetSMSCodeEventHandler(object sender, RoutedEventArgs args);
public class MsgCodeErrorEventArgs : EventArgs
{
public Exception error;
}
(1) 如果在引发事件后,事件发出通知的消息是有自定义数据的,那么应该将这些事件消息专门封装到一个类中进行打包传送,通常这个类继承于System.EventArgs。例如:
public class MsgCodeErrorEventArgs: EventArgs {
public Exception error;
}
在委托原型中我们发现有一个参数 object sender,这是事件模型要求的,它是引发事件的对象,并且要求是object 类型,之所以要求是object类型,是方便于继承,因为促使事件引发的对象可能是很多种类型。后一个参数是委托的参数,尽量保证事件数据参数名为e,这样更方便使用者理解,如:MsgCodeErrorEventArgse。
事件定义的时候通常event结尾,命名规范。如SMSEevent
public event GetSMSCodeHandler ValidSMSCodeChanged;
下面的没用过,在网上看到的,记录下:怎么用还待自己探索
.NET Framework还提供了泛型版本的事件委托:
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
这样在使用此委托时,就可以指定任意类型的事件数据包装器类型。当你想使用一个事件定义在多种场合下传递多种事件数据类型的时候,泛型委托很有用。如下:
public event EventHandler<MsgCodeErrorEventArgs> SMSEevent2;
一般引发该事件的函数用On开头,并且方法应该是受保护的虚方法,在派生类中可以重写此方法来控制对事件通知的发出。
如下面实例,
protected virtual void OnSMSEevent()
{
if (ValidSMSCodeChanged!= null)
{
MsgCodeErrorEventArgs args = new MsgCodeErrorEventArgs();
OnGetSMSCodeError(this, args);
}
}
然后再某一个地方OnSMSEevent()事件就可以被执行