【.NET基础】--委托、事件、线程(2)
本文介紹event的使用以及原理,本文接上一篇文章的Demo繼續(xù)【下載上一篇Demo】
上一篇我們?cè)陬?span style="font-size:12px;">(dg_SayHi.cs)里面定義代理了4個(gè)Delegate,然后在Button的后臺(tái)事件中?新建委托對(duì)象并初始化,這樣去使用委托。本文我們看一下event的使用以及原理.
1,現(xiàn)在我們?cè)赑erson類里面?定義一個(gè)dg_SayHi委托變量,這樣新建person類對(duì)象后就可以操作這個(gè)委托變量
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事件,事件中我們使用委托對(duì)象
private void btnPersonDelegate_Click(object sender, EventArgs e){Person per = new Person();//創(chuàng)建委托對(duì)象并賦值給person對(duì)象的dgSayHi對(duì)象per.dgSayHi = new dg_SayHi(SayHiCN);per.dgSayHi += SayHiEN;//調(diào)用委托對(duì)象 per.dgSayHi();}C,這樣點(diǎn)擊按鈕的時(shí)候,調(diào)用SayHiCN和SayHiEN方法,分別先后彈出窗口 “你好上海”?和 “hi shanghai”。
D,由于是直接操作委托對(duì)象dgSayHi,?這樣就可以直接把添加過方法的委托對(duì)象給清空或者重置,我們更新button后臺(tái)事件如下:
private void btnPersonDelegate_Click(object sender, EventArgs e){Person per = new Person();//創(chuàng)建委托對(duì)象并賦值給person對(duì)象的dgSayHi對(duì)象per.dgSayHi = new dg_SayHi(SayHiCN);per.dgSayHi += SayHiEN;//下面的代碼把之前添加在委托里的方法給清空了,然后把委托對(duì)象給重置了per.dgSayHi = null;per.dgSayHi = new dg_SayHi(SayHiEN);//調(diào)用委托對(duì)象 per.dgSayHi();} View CodeE,上面這樣,委托對(duì)象在運(yùn)行的過程中就會(huì)被不合理清空掉,這樣是不安全的。
?
2,為了對(duì)委托對(duì)象的操作進(jìn)行限制,我們把委托對(duì)象定義為私有,然后添加像屬性一樣的操作委托對(duì)象的方法
A,更新Person類,把委托變?yōu)樗接?#xff0c;并添加操作私有變量的方法
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 實(shí)現(xiàn)對(duì)委托變量的保護(hù)//定義委托變量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,這樣,我們就不能直接操作委托對(duì)象了,只有借助類似屬性的兩個(gè)方法去給委托對(duì)象添加、移除方法,更新Button事件如下:
private void btnPersonDelegate_Click(object sender, EventArgs e){Person per = new Person();per.AddMethod(SayHiCN);per.AddMethod(SayHiEN);per.PrintMethod();}C,上面這樣我們無法直接操作委托對(duì)象,從而實(shí)現(xiàn)了對(duì)委托對(duì)象的保護(hù)。
3,實(shí)際上.net的event幫我們做好了像步驟2一樣的封裝,從而實(shí)現(xiàn)對(duì)委托對(duì)象的保護(hù)
A,我們?cè)赑erson類中再次添加event聲明的委托如下:
//定義事件,實(shí)現(xiàn)和上面的封裝一樣的功能public event dg_SayHi dgSayHiByEvent;public void PrintMethodEvent(){dgSayHiByEvent();}B,button后臺(tái)事件中,我們對(duì)委托對(duì)象的操作也就只能去添加移除方法、而不能去清空或者New,如下:
private void btnPersonDelegate_Click(object sender, EventArgs e){Person per = new Person();////創(chuàng)建委托對(duì)象并賦值給person對(duì)象的dgSayHi對(duì)象//per.dgSayHi = new dg_SayHi(SayHiCN);//per.dgSayHi += SayHiEN;////下面的代碼把之前添加在委托里的方法給清空了,然后把委托對(duì)象給重置了//per.dgSayHi = null;//per.dgSayHi = new dg_SayHi(SayHiEN); per.dgSayHiByEvent += SayHiCN; //事件實(shí)現(xiàn)了對(duì)委托對(duì)象的保護(hù),可以+=、-=;但是不能再像上面初始化或者是清空per.dgSayHiByEvent += SayHiEN;//不可以直接調(diào)用委托對(duì)象,而是通過對(duì)象的方法調(diào)用;不可以這樣寫: per.dgSayHiByEvent(); per.PrintMethodEvent();}C,.NET Reflector中我們查看一下,我們加event的委托,實(shí)際上是 1,創(chuàng)建了Private dgSayHiByEvent 委托對(duì)象? 2, event事件中添加了兩個(gè)方法:add和remove方法;這兩個(gè)方法去操作Private dgSayHiByEvent委托對(duì)象。(和set,get類似)
D,所以event關(guān)鍵字本質(zhì)就是做了兩個(gè)事情,從而實(shí)現(xiàn)對(duì)委托對(duì)象的保護(hù):
1,創(chuàng)建了一個(gè)對(duì)應(yīng)的Private委托對(duì)象
? 2,然后添加Add和Remove方法訪問、操作這個(gè)Private委托對(duì)象。
4,委托和事件的對(duì)比:
A,?委托是類,只定義委托對(duì)象的話,沒法實(shí)現(xiàn)對(duì)委托對(duì)象的保護(hù),外部可以清空和新建
B,?事件是委托對(duì)象,事件自身實(shí)現(xiàn)了對(duì)委托對(duì)象的保護(hù),并提供了供外部訪問的兩個(gè)方法
C,事件只能對(duì)add,remove自己,不能賦值。事件只能"注冊(cè)自己 += " , “注銷自己 -= ” 不能=,外界不可以注銷其他注冊(cè)者,外界不可以主動(dòng)觸發(fā)事件。
?
【本文Demo下載】
?
轉(zhuǎn)載于:https://www.cnblogs.com/chengzish/p/4569912.html
總結(jié)
以上是生活随笔為你收集整理的【.NET基础】--委托、事件、线程(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计组之数据运算:3、定点数、浮点数
- 下一篇: 【uiautomator】UiDevic