1. 程式人生 > >C 之委託和事件

C 之委託和事件

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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#之旅,未完,待續......

         

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述