前言: 在我們學習C#的過程中,我們會學習到C#委託和事件,由於這是C#中比較進階的內容,所以學起來相當的費力,沒有一定的時間是體驗不來的,正好我這幾天在學這個知識點,所以做一個小總結,希望和我一樣的童鞋們能夠參考一下,我們共同進步!,此部落格屬於學習筆記,寫的不好,還請見諒!
1. 委託的定義
(1) 將方法作為變數使用的一種機制,就是將方法當作變數用(聲明,賦值,傳參)
(2) 將變數當作方法來用,首先就要去聲明變數,就要考慮變數的類型,就是(委託變數,對應方法的傳回值,參數等),顧名思義:委託就是委託別人去幹某些事情,下面是一個執行個體方法的實現
例如:我現在餓了,但是我很懶,就是不想出去買,所以這時候我可以委託室友幫我帶一份,這樣我就已經實現委託了,
如果我想去吃飯的話實現的代碼是:
class Program{ static void Main(string[] args) { chum ch = new chum(); ch.EatFood(); Console.ReadKey(); }}class chum{ public void EatFood() { Console.WriteLine("我要去吃飯了!"); }}
但是我今天很懶,我要在宿舍睡覺,所以我委託別人帶,這樣實現代碼就是
//定義委託
public delegate void EatFootDelegate(); class Program { static void Main(string[] args) { chum ch = new chum(); //這個地方就是授權,因為委託已經定義了這個委託類型可以使用什麼方法 //直接為變數賦值就可以了,賦值的時候使用方法名(不要括弧) EatFootDelegate leadfood = ch.EatFood; //此時我的室友就等同於我買吃的東西的方法了 leadfood(); Console.ReadKey(); } } class chum { public void EatFood() { Console.WriteLine("我要去吃飯了!"); } }
最後將這幾點做個總結如下:
(1)使用委託,就是需要有一個變數來指向這個方法
(2)定義一個委託類型的變數,先要定義一個委託(這個委託規定了可以賦值方法的資訊)
(3)文法:delegate 方法傳回型別 委託類型名(方法可用參數)
(4)委託就是一個類型
(5)使用委託就是讓方法可以當成變數用
1) 弄清楚那些方法需要當作變數用
2) 根據方法的傳回值和類型定義委託類型
3) 聲明委託類型的變數
4) 初始化委託變數(就是賦值)
5) 此時這個委託變數就是等價於方法了,使用委託變數加圓括弧就是在調用指定的那個方法
6) 既然是變數,就可以通過參數傳遞等其他方式使用了
2. 靜態方法實現委託
(1)委託變數在指向方法的時候,就是"相當於"存放著方法的地址,在調用的時候直接到記憶體中找到方法代碼,執行
(2) 既然委託只是儲存方法,就不需要理會這個方法是什麼類型的(靜態還是執行個體的)
(3)實現調用方法的時候就是直接為其賦值即可
public delegate void FuncDelegate();class Program { static void Main(string[] args) { FuncDelegate func = SayHello; func(); Console.ReadKey(); } static void SayHello() { Console.WriteLine("我是一個靜態方法"); }}
(4)如果沒有為委託變數賦值,那麼會拋出異常(因為委託變數是null)
FuncDelegate func = null;
func();
這樣但在執行的時候會拋出異常"未將對象引用到對象的執行個體"
(5)委託是具有物件導向特徵的,所以你也可以new出對象
public delegate void FuncDelegate();class Program{ static void Main(string[] args) { FuncDelegate func = new FuncDelegate(SayHello); func(); Console.ReadKey(); } static void SayHello() { Console.WriteLine("我是一個靜態方法"); }}
(6)委託在使用的時候,由於委託變數指的就是方法,所以一般給委託變數命名使用Pascal命名規則
(7)委託是一個類(與指標的區別)
(8)自己定義的委託來自於MulticastDalagete類型,而Multicastdatagete有來自於Delegate類型
3. Invoke
(1)委託變數作為方法進行進行調用執行,其本質就是Ivoke方法實現的
FuncDelegate func=Function;
func()等價於 func.Invoke(),下面代碼說明了這點
public delegate void FuncDelegate();class Program{ static void Main(string[] args) { FuncDelegate func = Show; func.Invoke(); Console.ReadKey(); } public static void Show() { Console.WriteLine("Invoke"); }}
4. 執行個體方法和靜態方法在執行時的一點小區別
(1)因為執行個體方法包含執行個體的成員,所以執行的時候我們設定斷點可以查看一下這個簡單的方法的執行結果,代碼:
public delegate void FuncDelegate();class Program{ static void Main(string[] args) { Person p = new Person() { Name = "張三" }; FuncDelegate func = new FuncDelegate(p.sayHello); FuncDelegate funcstatic = new FuncDelegate(show); func(); funcstatic(); Console.ReadKey(); } public static void show() { Console.WriteLine("show"); }} class Person { public string Name { get; set; } public void sayHello() { Console.WriteLine(Name); }}
下面的章節還會詳細介紹委託和事件的