【.NET基础】--委托、事件、线程(2)
本文介紹event的使用以及原理,本文接上一篇文章的Demo繼續【下載上一篇Demo】
上一篇我們在類(dg_SayHi.cs)里面定義代理了4個Delegate,然后在Button的后臺事件中?新建委托對象并初始化,這樣去使用委托。本文我們看一下event的使用以及原理.
1,現在我們在Person類里面?定義一個dg_SayHi委托變量,這樣新建person類對象后就可以操作這個委托變量
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;} View CodeB,添加按鈕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();} View CodeE,上面這樣,委托對象在運行的過程中就會被不合理清空掉,這樣是不安全的。
?
2,為了對委托對象的操作進行限制,我們把委托對象定義為私有,然后添加像屬性一樣的操作委托對象的方法
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} View CodeB,這樣,我們就不能直接操作委托對象了,只有借助類似屬性的兩個方法去給委托對象添加、移除方法,更新Button事件如下:
private void btnPersonDelegate_Click(object sender, EventArgs e){Person per = new Person();per.AddMethod(SayHiCN);per.AddMethod(SayHiEN);per.PrintMethod();}C,上面這樣我們無法直接操作委托對象,從而實現了對委托對象的保護。
3,實際上.net的event幫我們做好了像步驟2一樣的封裝,從而實現對委托對象的保護
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委托對象。
4,委托和事件的對比:
A,?委托是類,只定義委托對象的話,沒法實現對委托對象的保護,外部可以清空和新建
B,?事件是委托對象,事件自身實現了對委托對象的保護,并提供了供外部訪問的兩個方法
C,事件只能對add,remove自己,不能賦值。事件只能"注冊自己 += " , “注銷自己 -= ” 不能=,外界不可以注銷其他注冊者,外界不可以主動觸發事件。
?
【本文Demo下載】
?
轉載于:https://www.cnblogs.com/chengzish/p/4569912.html
總結
以上是生活随笔為你收集整理的【.NET基础】--委托、事件、线程(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计组之数据运算:3、定点数、浮点数
- 下一篇: ASP.NET Web API 特性