在看下文的時候,你先要明白一個問題,什么是委托,什么是事件。但其實很讓人頭疼無解的是,即使有的時候你明白了這些原理,但在實際的運用中還是一臉懵逼,無從下手。
其實在很多的時候,你可能在wpf,winfrom的使用的多,不過這坑爹玩意又不能不去弄明白!
委托和事件
委托:方法作另一個方法的參數 和類一樣,委托是用戶自定義的類型,但是類是數據和方法的集合,而委托是持有一個或多個方法。
delegate 不可思議這就是委托的代表關鍵詞,然而隨着C#的發展有了語法糖,很多人又使用了action ,function去代替了delegate,如ntf,
.netcore的Task都離不開它們,但本文還是用原始的delegate,需要了解action,function的可以自尋查閱資料
事件:建立在委托之上,通過機制某個類在發生某些特定的事情之后,通知其他類或對象正在發生的事情。event代表性關鍵字
認識發布者和訂閱者
發布者定義一系列的事件,並提供一個注冊的方法;訂閱者向發布者注冊,並提供一個可被回調的方法,也就是事件處理的程序。這時候
當事件被觸發,訂閱者接收到通知,訂閱者的提交所有方法被執行
1.發布者擁有某些事件的類和結構
2.訂閱者向發布者注冊類和結構
3.事件處理指訂閱者注冊到事件的方法,在發布者出發被執行
事件注冊 :訂閱者通過**+=**操作符來注冊事件,並提供一個事件處理程序
以上基本是通用的概念,但還是希望你去看下吧,好了下面開始正文:
例子:比如某個班級,有class1,class2班別等等,向某位同學通知他的期末成績修改變動。這里我們先考慮一下誰是訂閱者,誰是發布者,事件應該寫在哪里,觸發事件又是什么
其實上面也可以看成有個等級的分明,班級為發布者,訂閱者為分數變動,某位同學。 引發函數的事件:分數變動 ,Student_Grade為事件的響應函數
廢話說了一大堆,好了直接上代碼
【1】定義分數事件的參數類,繼承EventArgs,EventArgs是包含事件數據的類的基類,用於傳遞事件的細節。
public class GradeChangeEventArg : EventArgs { public string _name; public float _Grade; public GradeChangeEventArg(string name,int Grade) { _name = name; _Grade = Grade; } }
【2】.定義分數變化的委托類型
object sender:表示觸發事件的控件對象
GradeChangeEventArgs arg:表示事件數據的類的基類
public delegate void GradeChangeEventHandle(object sender, GradeChangeEventArg arg);
下面寫個Student的實體,
UpdateGrade 為一個觸發事件的函數
public class Student { public string _name; public Student(string name) { _name = name; } public event GradeChangeEventHandle GradeChange;//它實際上就是GradeChangeEventHandle類型的委托 //這里需要考慮怎么引發上面事件 protected void OnGradeChange(GradeChangeEventArg arg) { //if (GradeChange!=null) //{ // //GradeChange(this, arg); //}
//簡化可以寫成這樣,不懂得自行查閱資料 GradeChange?.Invoke(this,arg); } //更新學生名字和引發分數變化事件 public void UpdateGrade(string nm,int grade) { GradeChangeEventArg arg=new GradeChangeEventArg(nm, grade); this.OnGradeChange(arg); } }
【3】.下面可以用Action的形式去代替原有的步驟2和事件GradeChange的定義,不明白的請自行查閱資料

public Action<object,GradeChangeEventArg> GradeChange;
【4】.ClassRoom實體,可以看出Student_Grade為事件的響應函數
public class ClassRoom { public string _classname; public ClassRoom(string classname) { _classname = classname; } public void Student_Grade(object sender, GradeChangeEventArg arg) { Student st = sender as Student; Console.WriteLine($"{arg._name}班級{_classname}:同學{st._name}收到期末成績通知為{arg._Grade}"); } }
【5】.Main函數

static void Main(string[] args) { Student student1 = new Student("Evan"); Student student2 = new Student("Sola"); ClassRoom classRoom1 = new ClassRoom("Class1"); ClassRoom classRoom2 = new ClassRoom("Class2"); student1.GradeChange += classRoom1.Student_Grade; student1.UpdateGrade("高三",98); }
若要轉載請附上作者原文鏈接 https://www.cnblogs.com/hexsola1314/p/13233907.html Evan