本文介紹event的使用以及原理,本文接上一篇文章的Demo繼續【下載上一篇Demo】
上一篇我們在類(dg_SayHi.cs)里面定義代理了4個Delegate,然后在Button的后臺事件中 新建委托對象并初始化,這樣去使用委托。本文我們看一下event的使用以及原理.
A,Person類添加委托變量
public class Person { #region 姓名 string name; public string Name { get { return name; } set { name = value; } } #endregion #region 年齡 int age; public int Age { get { return age; } set { age = value; } } #endregion //定義委托變量 public dg_SayHi dgSayHi; }
B,添加按鈕btnPerson以及btnPersonDelegate_Click事件,事件中我們使用委托對象
PRivate void btnPersonDelegate_Click(object sender, EventArgs e) { Person per = new Person(); //創建委托對象并賦值給person對象的dgSayHi對象 per.dgSayHi = new dg_SayHi(SayHiCN); per.dgSayHi += SayHiEN; //調用委托對象 per.dgSayHi(); }
C,這樣點擊按鈕的時候,調用SayHiCN和SayHiEN方法,分別先后彈出窗口 “你好上海” 和 “hi shanghai”。
D,由于是直接操作委托對象dgSayHi, 這樣就可以直接把添加過方法的委托對象給清空或者重置,我們更新button后臺事件如下:
private void btnPersonDelegate_Click(object sender, EventArgs e) { Person per = new Person(); //創建委托對象并賦值給person對象的dgSayHi對象 per.dgSayHi = new dg_SayHi(SayHiCN); per.dgSayHi += SayHiEN; //下面的代碼把之前添加在委托里的方法給清空了,然后把委托對象給重置了 per.dgSayHi = null; per.dgSayHi = new dg_SayHi(SayHiEN); //調用委托對象 per.dgSayHi(); }
E,上面這樣,委托對象在運行的過程中就會被不合理清空掉,這樣是不安全的。
A,更新Person類,把委托變為私有,并添加操作私有變量的方法
public class Person { #region 姓名 string name; public string Name { get { return name; } set { name = value; } } #endregion #region 年齡 int age; public int Age { get { return age; } set { age = value; } } #endregion #region 實現對委托變量的保護 //定義委托變量 private dg_SayHi dgSayHi; public void AddMethod(dg_SayHi Para_dgSayHi) { dgSayHi += Para_dgSayHi; } public void RemoveMethod(dg_SayHi Para_dgSayHi) { dgSayHi -= Para_dgSayHi; } public void PrintMethod() { dgSayHi(); } #endregion }
B,這樣,我們就不能直接操作委托對象了,只有借助類似屬性的兩個方法去給委托對象添加、移除方法,更新Button事件如下:
private void btnPersonDelegate_Click(object sender, EventArgs e) { Person per = new Person(); per.AddMethod(SayHiCN); per.AddMethod(SayHiEN); per.PrintMethod(); }
C,上面這樣我們無法直接操作委托對象,從而實現了對委托對象的保護。
A,我們在Person類中再次添加event聲明的委托如下:
//定義事件,實現和上面的封裝一樣的功能 public event dg_SayHi dgSayHiByEvent; public void PrintMethodEvent() { dgSayHiByEvent(); }
B,button后臺事件中,我們對委托對象的操作也就只能去添加移除方法、而不能去清空或者New,如下:
private void btnPersonDelegate_Click(object sender, EventArgs e) { Person per = new Person(); ////創建委托對象并賦值給person對象的dgSayHi對象 //per.dgSayHi = new dg_SayHi(SayHiCN); //per.dgSayHi += SayHiEN; ////下面的代碼把之前添加在委托里的方法給清空了,然后把委托對象給重置了 //per.dgSayHi = null; //per.dgSayHi = new dg_SayHi(SayHiEN); per.dgSayHiByEvent += SayHiCN; //事件實現了對委托對象的保護,可以+=、-=;但是不能再像上面初始化或者是清空 per.dgSayHiByEvent += SayHiEN; //不可以直接調用委托對象,而是通過對象的方法調用;不可以這樣寫: per.dgSayHiByEvent(); per.PrintMethodEvent(); }
C,.NET Reflector中我們查看一下,我們加event的委托,實際上是 1,創建了Private dgSayHiByEvent 委托對象 2, event事件中添加了兩個方法:add和remove方法;這兩個方法去操作Private dgSayHiByEvent委托對象。(和set,get類似)
D,所以event關鍵字本質就是做了兩個事情,從而實現對委托對象的保護:
1,創建了一個對應的Private委托對象
2,然后添加Add和Remove方法訪問、操作這個Private委托對象。
A, 委托是類,只定義委托對象的話,沒法實現對委托對象的保護,外部可以清空和新建
B, 事件是委托對象,事件自身實現了對委托對象的保護,并提供了供外部訪問的兩個方法
C,事件只能對add,remove自己,不能賦值。事件只能"注冊自己 += " , “注銷自己 -= ” 不能=,外界不可以注銷其他注冊者,外界不可以主動觸發事件。
【本文Demo下載】
新聞熱點
疑難解答