類或對象可以通過事件向其他類或對象通知發生的相關事情
發行者確定何時引發事件,訂戶確定執行何種操作來響應該事件。
C#中的事件處理實際上是一種具有特殊簽名的delegate
假設一個場景 :老師登記分數後,學生馬上接收到分數
發布者首先要寫的代碼
1、定義一個委托和事件,寫一個方法,當這個方法調用時觸發事件通知訂閱者
public class Teacher
{
public delegate void TellScoreEventHandler(object sender, ScoreEventArgs e);
public event TellScoreEventHandler tellScoreEvent;
/// <summary>
/// 通知訂閱者事件發生
/// </summary>
/// <param name="e"></param>
public void OnTellScore(ScoreEventArgs e)
{
if (tellScoreEvent != null)
tellScoreEvent(this, e);
}
/// <summary>
/// 調用方法時,觸發事件
/// </summary>
/// <param name="name"></param>
/// <param name="score"></param>
public void TellStudentSocre(string name,int score)
{
ScoreEventArgs scoreArgs = new ScoreEventArgs(name, score);
OnTellScore(scoreArgs);
}
}
/// <summary>
/// 自定義事件數據的類
/// </summary>
public class ScoreEventArgs : EventArgs
{
public int Score { get; set; }
public string Name { get; set; }
public ScoreEventArgs(string name,int score)
{
this.Name = name;
this.Score = score;
}
}
2、先添加一個訂閱者,後調用發布者中能觸發事件的方法
Student stu = new Student();
Teacher teacher = new Teacher();
teacher.tellScoreEvent += new Teacher.TellScoreEventHandler(stu.teacher_tellScoreEvent);
teacher.TellStudentSocre("奮斗的QB", 100);
3、在訂閱者裡處理,當事件發生時,如何處理
public class Student
{
//當事件發生後,如何處理
public void teacher_tellScoreEvent(object sender, ScoreEventArgs e)
{
MessageBox.Show(e.Name + "考了" + e.Score.ToString());
}
}