天天看點

C# 委托 事件問題來源:問題了解:問題延伸:引言:與指針的比較:事件:委托舉例:總結(差別):

問題來源:

敲三層登陸頁面的例子,但是總是出現一個重複的錯誤,那就是

C# 委托 事件問題來源:問題了解:問題延伸:引言:與指針的比較:事件:委托舉例:總結(差別):

錯誤提示為:

C# 委托 事件問題來源:問題了解:問題延伸:引言:與指針的比較:事件:委托舉例:總結(差別):

查了半天都不知道到底是哪的錯誤,看見前面的EventHandler,就知道了肯定是委托的問題了。

EventHandler是一個聲明委托的微軟C#的命名标準。

問題了解:

new System.EventHandler(this.Form1.Load)建立的就是一個委托類型的執行個體,讓該委托指向了this.Form1.Load方法,也就是說在程式運作的某一時刻,系統會通過這個委托執行個體間接的調用這個方法。

詳細分析:

解決上述問題的方法,就是把Form1.Designer中的這句話去掉,然後單擊Form1_Load,直接輸入想要顯示的視窗,如:

C# 委托 事件問題來源:問題了解:問題延伸:引言:與指針的比較:事件:委托舉例:總結(差別):

這樣寫程式就會自動添加委托,而無需自己添加了。

問題延伸:

  仔細觀察,在C#中的事件方法中都帶了“Object sender,EventArgs e"這兩個參數,這不就是和委托相似嗎?是以上述問題才可以互相轉化。

引言:

   委托是什麼?當聽到這個詞語的時候,已經賦予了我們想象的空間,假如我要做一個動畫版的小程式,Flash部分并不是我所熟悉的,那麼我就把Flash那部分委托給了我的同學,讓他去完成,這就是所謂的委托。把自己所不能做的事情讓其它人去完成。

   委托是一個類,它定義了方法的類型,使得可以講方法當做另一個方法來進行傳遞,這種将方法動态的賦給參數的做法,可以避免在程式中大量的使用If …… else語句,使得程式具有更好的可擴充性。

與指針的比較:

   在c#中,對于其作用是這樣描述的:委托就像一個函數的指針,在程式運作時可以使用它們來調用不同的函數,回到上述做小程式的例子,加入我有兩個同學可以完成自己交代給他們的任務,隻要能夠滿足自己的需要(接口),盡管兩個人做的過程不一樣,并且做出的效果也不一樣,但是隻要能夠達到我的要求就可以了。

   除此,委托可以引用執行個體和靜态方法,而函數指針隻能引用靜态方法,其實對于指針的使用,大多數還是在c/c++中,函數的位址就是一個記憶體位址,不攜帶任何額外的資訊,說通俗點就是不帶有感情色彩,但是委托就不一樣了,委托是面向對象的,而且類型是安全的。委托會檢測它儲存的函數引用是否和生命的委托比對,盡職盡責。

事件:

  事件常用Event來表示,也就是一個使用者操作,如單擊,滑鼠移動等等。事件在類中聲明且生成。

聲明事件:

在類的内部聲明事件,首先必須聲明該事件的委托類型。如:

<strong>public delegate void MemoryLogHandler(string status)</strong>
           

然後聲明事件本身:

<strong>//基于上面的委托定義事件
    public event MemoryLogHandler MemoryEventLog;</strong>
           

  上面兩句代碼則是定義了一個名為MemoryLogHandler的委托和一個名為MemoryEventLog的事件,該事件在生成的時候會調用委托。

委托舉例:

就說上述編寫動畫小程式的例子吧!

<strong> //制作Flash的同學類
    public class Student
    {
        public static void WriteFlash()
        {
            Console.WriteLine("對Flash的工作,我會認真完成的");
        }
    }
    class Oneself  //自己
    {
        //聲明一個委托,其實也就是一個指令
        public delegate void WriteFlashEventHandler();

        public static void Main(string []args)
        {
            //這裡主要是闡述這個指令是幹什麼的,讓會Flash的同學幫助自己制作Flash
            //這是委托的聲明方法,後邊一定要加上委托的方法Student.WriteFlash,因為委托的構造函數不能為空
            WriteFlashEventHandler myDelegate = new WriteFlashEventHandler(Student.WriteFlash);
            //委托被附上了具體的方法
            myDelegate();
            Console.ReadKey();
        }
    }</strong>
           

  學習到這,就不得不涉及到“委托鍊”的概念了,除了Flash的任務需要讓自己的同學完成外,自己還需要對其個别的按鈕來美化一下,也就是說讓自己的同學做第二件事情,這個過程就叫做“委托鍊”了!

<strong>myDelegate += Student.BeautifulCommand</strong>
           

加上這句代碼之後,這時候就是執行的兩個事件了。

總結(差別):

  要說這兩者到底有什麼差別呢?可是定義事件就是一個狹義的委托。對于委托,它可以直接安排誰是他的調用函數,也可以直接調用,而對于事件則不行,它隻能通過某些操作出發。進而可以了解委托的主要用途是方法調用,函數回調和事件,而事件主要用于外發消息。

繼續閱讀