這幾天認真研究了C#的委托與事件,下面對研究的知識總結一下,N年後找出來看一下應該也不錯。
歷史上,Windows API經常使用C語言風格的函數指針來創建稱為回調函數或簡稱為回調的實體。使用回調,碼農可以使一個函數返回報告給(即回調)程序中的另一個函數。
在.NET Framework裡,回調仍是可能的,它們的功能是由使用更為安全和面向對象的委托(delegate)來完成的。本質上來講,委托是一個類型安全的對象,它指向程序中另一個以後會被調用的方法(或多個方法)。委托類型包含3個得要的信息:
當一個委托被創建並提供了上述信息後,它可以在運行時動態調用其指向的方法。可以看到,.NET Framwwork中每個委托(包括自定義委托)都被自動賦予同步或異步訪問方法的能力,可以不用手工創建與管理一個Thread對象而直接調用另一個輔助執行線程上的方法,這大大簡化了編程工作。
使用C#定義委托:假定我們要創建一個名為BinaryOp的委托,它可以指向任何輸入兩個整數返回一個整數的方法:
public delegate int BinaryOp(int x,int y);
當C#編譯器處理委托類型時,它先自動產生一個派生自System.MulticastDelegaet的密封類。這個類與它的基類System.Degelate 一起為委托提供必要的基礎設施,以維護以後將要調用方法的列表。
寫著寫著突然沒電,沒保存,比改需求還痛苦,沒辦法,只能重來。
如果我們通過ildasm.exe來查看BinaryOp委托可以看到,生成的BinaryOp類定義了三個公共方法。Invoke()可能是核心方法,因為它被用來以同步方式調用委托類型維護的每個方法。BeginInvoke()和EndInvoke()方法能在第二個執行線程上異步調用當前方法。
編譯器是如何確切知道怎樣定義Invoke()、BeginInvoke()和EndInvoke()方法的呢?欲知後事如何,請看下面代碼:
BinaryOp( target, Invoke( x, IAsyncResult BeginInvoke( x, y,AsyncCallback cb,
初次接觸委托可能會感覺很難。不要緊,接下來,讓我們看一個非常簡單的使用BinaryOp委托的示例,我們以前見過,這是一個名為Simple Delegate的控制台應用程序項目。
BinaryOp( x, Add( x, x + Substract( x, x - Main( BinaryOp d = ,
.net委托是類型安全的。所以如果讀者試圖將一個不匹配模式的方法傳入委托,將會收到編譯期錯誤。例如,假定SimpleMath類定義了一個名為SquareNumber()的方法:
SquareNumber( a*
由於BinaryOp委托公可指向帶有兩個整數參數並返回一個整數的方法下面這段代碼是非法的,將無法編譯:
BinaryOp b2= BinaryOp(SimpleMath.SquareNumber);
委托對象
我們在program類型中創建一個名為DisplayDegelateInfo()的靜態方法豐富當前的示例。這個方法將輸出傳入的委托類型所維護的方法的名稱和定義該方法的類的名稱。通過迭代由GetInvocationList()返回的System.Delegate數組,調用每個對象的Target和method屬性:
(Delegate d