C 之委託和事件
阿新 • • 發佈:2019-01-14
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
我想,讀者們可能看過一部電影叫《全民目擊》,在電影中,富豪林泰婚期將至,準新娘卻慘死地下停車場,林泰的富二代女兒林萌萌成為最大嫌疑人,林泰不惜重金聘請國內頂級律師周莉為女兒辯護,而公訴方卻是十多年一直追查林泰的童濤。隨著法庭質證的深入,罪案真相卻越來越撲朔迷離。所有人都深陷迷局,真相隱遁在迷霧之中。一如電影的主題,“人的一生,總有些東西比命還重要。”心靈的救贖,更發人深省。在電影中,林泰需要打官司,聘請國內頂級律師周莉為女兒萌萌辯護,然而律師真正執行的是當事人的陳詞,這時候律師就是一個委託物件,當事人委託律師這個物件去幫助自己辯護,這就是我們電影中委託的例子,然而c#中委託的概念也就好比周莉律師這個物件,從中可以得出委託是一個類,因為只有類才有物件的概念,從而也體現了c#是面向物件的語言。在我們的程式世界中,委託也如電影這般簡單麼?當然,什麼是OO,OO就是現實世界的抽象,所有現實世界的事物,在OO裡都能得到很好的詮釋,在我們的現實世界中,委託相當於一個命令,做事情的是別人,而在程式的世界裡委託知識儲存了各個方法的地址,而她自己什麼都不做,接下來,我們舉一個簡單的例子,時至母親節,姐姐委託妹妹去買康乃馨送給媽媽,怎麼在程式的世界中體現呢?
//妹妹類 public class Meimie { //其實買康乃馨,辛苦的是妹妹 public static void BuyCarnation() { Console.WriteLine("老姐啊,一起買,才有心意!"); } } //姐姐類 class Jiejie { //宣告一個委託,其實就是個“命令” public delegate void BuyCarnation(); public static void Main(string[] args) { //這裡就是具體闡述這個命令是幹什麼的,本例是meimei.BuyCarnation“妹妹買康乃馨” BuyCarnationEventHandler myDelegate = new BuyCarnationEventHandler(meimei.BuyCarnation); //這時候委託被附上了具體的方法 myDelegate(); Console.ReadKey(); } }
其中,
BuyCarnationEventHandler myDelegate = new BuyCarnationEventHandler(meimei.BuyCarnation);
是委託的宣告方法,BugCarnationEventHandler(委託的方法),委託的方法必須要加上,因為委託的建構函式是不為空的,注意,委託的引數和返回型別,都要和我們要具體委託的方法一致,如
public delegate void BuyCarnationEventHandler(); public static void BuyCarnation() { Console.WriteLine("老姐啊,一起買,才有心意!"); }
說到委託,不得不提一下我們的事件,那麼什麼是事件呢?EVENT?Click Event,Load Event,一連串的概念衝擊著我小小的腦袋,那麼到底是什麼事件呢?事件是類在發生其關注的事情時用來提供通知的一種方式,事件的發生一般都牽扯到兩個角色,一個是事件發行者(Publisher),也稱作是傳送者(Sender),其實就是一個物件,這個物件會自行維護本身的狀態資訊,當本身狀態資訊變動時,便觸發一個事件,並通知所有的事件訂閱者;另一個是事件訂閱者(Subscriber),對事件感興趣的物件,也稱為Receiver,可以註冊感興趣的事件,在事件發行者觸發一個事件後,會自動執行這段程式碼,我們來舉一個簡單的例子,看看我們的“事件”是如何在我們的程式設計世界中完美體現的:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication2{ //釋出者(Publiser) public class Publisher { //宣告一個花店的委託 public delegate void PublishEventHander(); //在委託的機制下我們建立一個花店事件 public event PublishEventHander OnPublish; //事件必須要在方法裡去觸發,花店出售康乃馨方法 public void issue() { //如果有人預定了這個事件,也就是這個事件不是空 if (OnPublish != null) { Console.WriteLine("表達愛意的康乃馨今天出售哦!"); OnPublish(); } } } //Subscriber 預定者,妹妹 public class Jiejie { //對事件感興趣的事情,這裡指對花店康乃馨感興趣 public static void Receive() { Console.WriteLine("噢耶,我已經收到表達愛意的康乃馨!!"); } } //Subscriber 預定者,妹妹 public class Meimei { //對事件感興趣的事情 public static void Receive() { Console.WriteLine("妹妹,辛苦了!"); } } class Story { public static void Main(string[] args) { //例項化一個花店 Publisher publisher = new Publisher(); //給這個出售康乃馨事件感興趣的預定者,此例中是妹妹 publisher.OnPublish += new Publisher.PublishEventHander(Jiejie.Receive); //另一種事件註冊方式 //publisher.OnPublish += Jiejie.Receive; //釋出者在這裡觸發出售康乃馨者的事件 publisher.issue(); Console.ReadKey(); } }}
執行效果如下:
事件是一種特殊的委託,我們來看看兩者的使用流程有什麼不一樣的地方:
事件和委託有著密切的關係,宣告一個事件語法和宣告一個委託及其相似,唯一的區別就是新增Event關鍵字,她沒有返回值,雖然一般用Public關鍵字修飾,但是事件無法在外部觸發,而委託卻可以在外部直接呼叫,.Net Framework使用委託來提供實現事件驅動的機制,委託是一個方法列表,事件可以看成是委託的特例。C#之旅,未完,待續......