天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

解惑答疑:C#委托和事件

  相信很多人一直為C#委托和事件所困惑,尤其是C#的初學者,學到這一部分會感覺比較困難,很有可能就放棄了,而且.NET對委托和事件封裝得挺好,一般都不怎么用到自定義的委托和事件,所以放棄學習該技術就有了借口!

  網上也有不少此類的文章,最具代表性的是張子陽的C#中的委托和事件這篇,寫得的確很好,得到很多讀者的贊賞,但我看評論,還是發現了些問題,因為有不少讀者是看了一遍又一遍,每次感覺都蠻好,可是隔一段時間,對“委托和事件”又迷糊了,于是又來看!我真搞不懂,為什么會出現這種情況!后來想想,文章雖好,但總結的地方沒有把重點列出來;再者,讀者跟著作者的思路,的確能把文章看懂,但是讀者自己不得要領,沒有真正弄明白,因此就出現了上面提到的狀況!

  C#委托和事件真的難嗎,其實不然。要搞懂它,第一,要看你的理解能力;第二,要看你怎么理解它。如果你覺得理解起來比較困難,那我們可以換種理解方式,也許能很好地理解它了!其實委托和事件的確不難,大牛級別的甚至都不屑寫此類文章!

  為什么會有委托?

  委托其實就是個方法指針,擁有同樣參數和返回值的任何方法都能傳給委托;委托能夠消除條件分支語句,不需要根據if、case這些語句來判斷具體調用哪個方法!而委托又是從觀察者模式演化而來,這里推薦閱讀TerryLee的這篇觀察者模式文章。  

  前面說的的就算不理解也不要緊,關鍵是理解方法、委托、事件之間的關系。可以這樣說,方法是“委托”給委托的,而委托是“委托”給事件的。可以將事件看成是委托的一個容器,里面可以加一連串的委托!這樣來理解,那所有的事情就都解決了!

  當然,我們都是在某個方法中觸發事件,事件將其交給委托,委托再交給方法,方法再進行實際的操作,與上面的步驟剛好相反!其實觸發事件的目的就是觸發具體方法!

  再來說說委托的好處(上面沒舉例子),比如你開發了一個電子商務平臺,后臺有管理商品的功能,而商品信息有七八列或者更多,包括編號、商品名稱、價格、上架時間等等,該信息又能根據任意一列來進行排序!如果沒有委托,我們將根據點擊某列所產生的信息,將這信息傳給某個排序方法,而這個排序方法會接受傳來的信息作為參數,再根據內部的分支語句if、case等來判斷具體采用哪個排序方法,這樣的話,邏輯變復雜,這過程當中還要做很多無用功(因為很有可能要進行多次判斷才能找到要真正執行的方法),而且如果我們將來再增加列,又得增加分支語句,違背了“開放—封閉”原則,維護起來比較麻煩!有了委托,我們不需要傳遞任何參數,直接將具體方法傳給委托即可,增加列則只要增加一個新方法,爽!我們完全可以通過委托來調用方法,那為什么還要事件呢?事件其實是對委托進行一種限制,使其無法使用“=”賦值運算符(如果使用則在編譯時產生錯誤),只能使用“+=”或者“-=”運算符,這就防止了程序員誤將原先的委托鏈給覆蓋掉,另外delegate類從MulticastDelegate(多路廣播委托)繼承而來,所以可以將多個委托賦給同一個事件!

  最后,列一串代碼把上面的概念理清一下

class Program
{
static void Main(string[] args)
{
 XiaoBai xiaobai
= new XiaoBai();
//Google公司
ItCompany google = new ItCompany("谷歌中國", "CTO", xiaobai);
//微軟公司
ItCompany microsoft = new ItCompany("微軟中國", "架構師", xiaobai);
//花旗銀行
FinanceCompany AmericaBank = new FinanceCompany("花旗銀行", "金融分析師", xiaobai);
//委托的好處,可以應用于不同的類的不同方法
//方法“委托”給委托,委托“委托”給事件
//委托類型與事件聲明時的委托類型相同
//因為是傳引用,所以方法后面不能帶括號,帶括號則是調用方法了
//一個委托可以搭載多個方法,一個事件則擁有一個委托鏈
xiaobai.Update += new TheEventHandler(google.ComeToItCompany);
xiaobai.Update
+= new TheEventHandler(microsoft.ComeToItCompany);
xiaobai.Update
+= new TheEventHandler(AmericaBank.ComeToFinanceCompany);
xiaobai.SubjectState
= "我小白過來應聘職位啦!";
//發出通知,觸發事件
xiaobai.Notify();
//以下代碼與上面相似
XiaoHua xiaohua = new XiaoHua();
ItCompany microsoft2
= new ItCompany("微軟總公司", "CEO", xiaohua);
FinanceCompany ChinaBank
= new FinanceCompany("中國央行", "財務部總經理", xiaohua);
xiaohua.Update
+= new TheEventHandler(microsoft2.ComeToItCompany);
xiaohua.Update
+= new TheEventHandler(ChinaBank.ComeToFinanceCompany);
xiaohua.SubjectState
= "我小華過來應聘職位啦!";
xiaohua.Notify()
Console.ReadLine();
}
}
//通知者接口
interface Subject
{
void Notify();

string SubjectState
{
get;
set;
}
}
 
//事件處理程序的委托,相當于一個類(在編譯成IL后確確實實是類)或者方法指針,
與常規類定義不同,帶參數和返回值

delegate void TheEventHandler();
//小白
class XiaoBai : Subject
{
//聲明一事件Update,類型為委托TheEventHandler
public event TheEventHandler Update;
private string action; //用Notify方法觸發事件
public void Notify()
{
Update();
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
//小華
class XiaoHua : Subject
{
//聲明一事件Update,類型為委托TheEventHandler
public event TheEventHandler Update;
private string action;
//用Notify方法觸發事件
public void Notify()
{
Update();
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
//IT行業
class ItCompany
{
private string companyname;
private string job;
private Subject sub;

public ItCompany(string _companyname, string _job, Subject _sub)
{
companyname
= _companyname;
job
= _job;
sub
= _sub;
}
//參數和返回值與委托TheEventHandler一致
public void ComeToItCompany()
{
Console.WriteLine(
"{0} {1}: 來我們公司做{2}!", sub.SubjectState,
companyname, job);
}
}
//金融行業
class FinanceCompany
{
private string companyname;
private string job;
private Subject sub;

public FinanceCompany(string _companyname, string _job, Subject _sub)
{
companyname
= _companyname;
job
= _job;
sub
= _sub;
}
//參數和返回值與委托TheEventHandler一致
public void ComeToFinanceCompany()
{
Console.WriteLine(
"{0} {1}: 來我們公司做{2}!", sub.SubjectState,
companyname, job);
}
}

NET技術解惑答疑:C#委托和事件,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲理论片在线中文字幕 | 秋霞久久久久久一区二区 | 午夜4k最新福利 | 日本国产精品无码一区免费看 | 免费精品国偷自产在线在线 | 天堂岛www | 嫩草影院久久国产精品 | 皮皮在线精品亚洲 | 伊人久久中文字幕久久cm | 果冻传媒2021在线观看 | 国产精品久久久久久人妻精品流 | 亚洲AV综合99一二三四区 | 99久久国产极品蜜臀AV酒店 | 国产麻豆剧果冻传媒免费网站 | 午夜久久影院 | 午夜福利合集1000在线 | 亚洲一区免费在线观看 | 暖暖 日本 视频 在线观看免费 | 99久久久无码国产精品免费人妻 | 无码欧美XXXXX在线观看裸 | 国产成人精品区在线观看 | 精品无人区麻豆乱码1区2 | 依人在线观看 | 在线播放一区 | 偷柏自拍亚洲综合在线 | 欧式午夜理伦三级在线观看 | 国产热久久精 | 内射气质御姐视频在线播放 | 91在线青春娱乐精品分类 | 国产女合集第六部 | 妈妈的职业3完整版在线播放 | 亚洲中文无码永久免费 | 日本精品在线观看视频 | 99在线在线视频观看 | 曰批视频免费40分钟不要钱 | 亚洲精品理论电影在线观看 | 3d在线看小舞被躁视频 | 我要色色网 | 麻豆国产精品AV色拍综合 | 亚洲中文字幕在线精品 | 成年妇女免费播放 |