浅谈通过delegate订阅事件
委托和事件是C#语言一个新的术语,其实他们最初是起源于c/C++中的函数指针。
实现步骤:
1. 声明一个delegate对象。
2. 实现和delegate具有相同参数和返回值的函数实现(可以是静态和非静态的)。
3. 产生一个delegate对象的时候,把你刚刚实现的函数作为参数传给他的构造函数。
先看下面例子:
DAL类中:
public delegate void deleException(System.Exception exception);//声明一个委托
public event deleException evenException;//定义一个委托类型事件
public void CallEvent(System.Exception exception)//触发事件方法
{
deleException messageEvent = evenException;
if (messageEvent != null)
{
//通知所有已订阅事件的对象(传递消息)
messageEvent(exception);
}
}
/// <summary>
/// 打开与数据库连接
/// </summary>
/// <returns></returns>
public bool Open()
{
try
{
if (m_SqlCeConnection != null && m_SqlCeConnection.State == ConnectionState.Closed)
m_SqlCeConnection.Open();
return true;
}
catch (System.Exception e)
{
CallEvent(e);//触发事件
return false;
}
}
Form1类中:
private void ShowMessage(Exception ex)//事件处理
{
MessageBox.Show(ex.Message);
}
DAL _dal = new DAL(……)……;
_dal.evenException += new deleException(ShowMessage);//侦听事件
_dal.Open();//若Open()时产生异常,则调用ShowMessage();
在上面的例子中或许看不出有什么好的,但在某些场合,就显示很重要了。比如通过线程更新UI,因为线程直接更新UI是不安全的。
"委托"是"函数指针"链表,当然该链表也可以只有一个元素,如果这样的话:"委托" 约等于 "函数指针";
"事件"是一类特特殊的"委托",你定义一个"事件",表示你同时定义了:一个委托+两个方法。