類或對象可以通過事件向其他類或對象通知發生的相關事情
發行者確定何時引發事件,訂戶確定執行何種操作來響應該事件。
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()); } }