最近一直在回想C#中的委托和事件機制,突然覺得其實C#中的委托和時間機制其實真的和C++中的函數指針就是一樣一樣,可能因為
C#中沒有指針所以就弄出了支持委托和事件的機制。C#中它將方法做為特殊的對象進行封裝起來,從而實現了將方法名做為變量來使用和進行賦值
操作,C#中定義“函數指針”要用delegate關鍵字進行修飾。之後就可以直接可以用“函數指針”定義對象或者對象數組並進行賦值,賦值操作完成後就可以直接做為
相應的函數名使用,例如:
----------------------------YYC
public delegate int Func();
static int fun1()
{
return 1;
}
static int fun2()
{
return 2;
}
Func fc;
fc = fun1;
MessageBox.Show("fun1: "+ fc());//輸出1
fc = fun2;
MessageBox.Show("fun2: "+ fc());//輸出2
其中C#對委托對象估計采用的是一種隊列的儲存結構,所以委托對象是可以進行加減操作的,
例如:
public delegate int Func();
static int fun1()
{
MessageBox.Show("fun1:");
return 1;
}
static int fun2()
{
MessageBox.Show("fun2:");
return 2;
}
Func fc;
fc = (Func )fun1 + (Func)fun2 ;
fc();
當此時再調用fc()函數fun1()和函數fun2()都會被依據加載的順序被執行一遍。
但此時應當注意由於委托對象可以進行加減操作,所以再使用任何一個異常是應當先判斷該委托是否為空.
當然C#中除了委托外其次很重要的另外一個機制就是事件及事件的發布。C#中出現事件類型的主要目的是由於為了
防止程序員的疏忽或惡意使用=直接再給對托類型對象賦值,從而破壞委托的加載,所以就出現了在使用函數指針定
義對象時要用event關鍵字進行修飾。
同時在C#的時間發布和訂閱過程中為了減少做重復性的工作和提高效率,C#已經為我們定義好了EventHandler委托類型
publuc delegate void EventHandler(oblect sender ,EventArgs e);
其中object類是所有類的基類,用來傳遞引發事件的對象即為發布者,如果發布者為靜態類,則直接傳遞null即可。一般在發布者類中直接使用this即可。
要注意此時傳輸時是屬於數據的裝箱操作,接收該對象後還要進行相應的拆箱操作。
EventArgs時間數據類,主要用於傳遞事件數據,只要該數據繼承了EventArgs即可傳輸。
總之說白了C#中的委托機制就是和C++中的函數指針是一樣的,可以類比的這樣去想。而後來的所謂訂閱者和發布者機制
也是基於此原理的。