You are on page 1of 4

1

事件與委派 (1)

事件是一種訊息傳遞機制,代表程式執行期間,正在發生的某種行為,例如按鈕被使用
者按下的動作,或是按下儲存按鈕所觸發的文件儲存動作,甚至在資料庫應用程式中,
移動資料庫記錄時,觸發的記錄移動事件等等,都是事件的實例。

要了解如何實作事件,首先必須認識一種特殊型別,委派(Delete), C# 透過委派實作事
件機制,除此之外,委派亦廣泛的應用在遠端呼叫與資料封送技術。

事件通常由某個特定的物件產生,並且由其他物件或方法接收並且進一步作處理,委派
類別本身則用以參考特定的方法,於事件觸發時引用其參考的方法處理被觸發的事件。

應用程式藉由所定義的方法執行某種運算,完成特定的工作,而委派本身則是一種能夠
參考特定方法的型別,因此,你可以透過委派執行所參考的方法,委派與方法的關係說
明下圖 :

從圖中你可以很清楚的了解委派的運作機制,它直接參考了某個特定的方法,並且在應
用程式需要的時候執行。

利用委派引用方法,必須實作封裝方法的委派,關鍵字 delegate 用來宣告一個委派型別


變數,語法如下:
2
事件與委派 (1)
delegate type delegateName(parameter)

其中的 delegateName 為指定的委派名稱,由於委派本身被用於參考特定的方法,因此上


式中的 type 即為其參考方法的回傳值型別,而 parameter 則為參考方法所接受的參數列內
容。

宣告所建立的委派型別,其回傳值以及參數列與往後所參考的方法,必須全完符合,這
種限制是可以理解的,當委派物件被使用於方法的叫用,我們所直接面對的是委派物件,
因此必須能夠符合叫用方法的型態,完成預期的行為。

一旦完成委派宣告,接下來只需建立委派型別物件,並且指定其參考的方法,最後直接
將此委派物件當作其參考的方法來使用即可。

範例

示範如何定義一個標準的委派型別,並且利用委派型別的實體物件,引用指定的方法,
分別計算正方形與圓形面積。

01 class UsingDelegates

02 {

03 static void Main()

04 {

05 long length1 = 10;

06 long length2 = 15;

07 myDelegate myDelegate1 = new myDelegate(Measure.Square);

08 myDelegate myDelegate2 = new myDelegate(Measure.Circle);

09 Console.WriteLine

010 ("邊長{0} 的正方形面積為: {1}",length1,

011 myDelegate1(length1).ToString());

012 Console.WriteLine

013 ("半徑{0} 的圓形面積為: {1}",length2,

014 myDelegate2(length2).ToString());

015 Console.ReadLine();
2
3

016 }

017 }

018 public delegate double myDelegate(long length);

019 public class Measure

020 {

021 public static double Square(long length)

022 {

023 double area;

024 area = Math.Pow(length, 2);

025 return (area);

026 }

027 public static double Circle(long length)

028 {

029 double area;

030 area = (4 / 3) * Math.PI * Math.Pow(length, 3);

031 return (area);

032 }

033 }

18 行使用 delegate 關鍵字,宣告一個委派類別 myDelegate,其中包含了一個型態為 long


的參數 length,且其回傳值型態為 double 。

19 行定義一個類別 Measure,其中包含兩個方法: Square 以及 Circle ,如同委派類別


myDelegate 的定義,這兩個方法接受一個型態為 long 的參數 length ,回傳值亦為 double
型態,分別用以計算特指定邊長的正方形面積以及指定半徑的圓形面積。

完成類別與物件的定義,現在嘗試使用委派類別 myDelegate 引用所定義的方法,於方法


Main 當中定義兩個委派物件: myDelegate1 以及 myDelegate2 ,其中將方法
Measure.Square 與 Measure.Circle 分別當作參數傳入。

完成委派類別的方法設定,接下來透過委派物件引用所參照的方法,進行指定的運算。

執行結果
4
事件與委派 (1)
邊長 10 的正方形面積為 : 100

半徑 15 的圓形面積為 : 10602.8752058656

經由上述範例,我們體驗了委派的相關實作,你現在應該可以輕易的透過委派封裝特定
方法,然後對其進行引用。

儘管直接引用方法成員,同樣可以完述上述的功能,然而委派對於方法的引用,提供了
更大的彈性,你可以透過同一個委派物件,於執行時期動態指定所要執行的方法成員。

下一篇事件與委派(2),我們提供更進一步的範例說明動態指定方法的技巧。

You might also like