C#學習筆記-委託,event
羅朝輝(http://www.cnblogs.com/kesalin/)
《C#與.NET進階程式設計》讀書筆記
1,.NET委託(delegate)是一個型別安全的對象,指向可以以後調用的其他方法,委託是內建支援多路廣播或非同步方法呼叫調用的對象。委託類型包含3個重要的資訊:它所調用的方法的名稱,該方法的參數(可選),該方法的傳回值(可選)。
2,當C#編譯器處理委託類型時,它自動產生一個派生自System.MulticastDelegate的密封類。這個類及其基類System.Delegate一起為委託提供必要的基礎設施,以維護以後將要調用方法的列表。該密封類中的Invoke()用於同步調用當前方法(後台自動被調用),而BeginInvoke()和EndInvoke()用於非同步呼叫當前方法,這三個方法的參數與傳回值基於委託的聲明。
3,建議將委託成員變數定義為私人的,可以強制封裝服務並提供型別安全。
4,協變(寬鬆委託)允許我們構建一個委託,能指向返回類及相關繼承體系的方法。具體做法是把委託的返回對象顯示強制轉換為繼承體系中某個類型。逆變(contravariance)允許我們建立一個委託,指向多個方法,方法的參數是存在傳統繼承關係的對象。
5,C#允許我們定義泛型委派類型。
6,為了簡化構建自訂方法來為委託調用列表增加和刪除方法,C#提供了event關鍵字。在編譯器處理event關鍵字時,它會自動提供註冊和登出方法以委託任何必要的成員變數。這些委託成員變數總是聲明為私人的,因此不能通過從觸發事件的對象直接存取它們。event只是文法糖,只是為了節省我們打字的時間。
定義一個事件分為兩步:首先,定義一個委託;然後,通過C# event 關鍵字用相關委託聲明這個事件。編譯器事實上會將 event 關鍵字擴充為兩個隱藏的公用方法,一個帶 add_ 首碼,一個帶 remove_ 首碼,首碼後面是C# event 的名稱。
7,匿名方法中最後一個大括弧必須以分號結束,否則,將產生一個編譯錯誤。匿名方法不能訪問定義方法的 ref 和 out 參數。
8,C#的方法群組轉換特性允許我們給一個事件處理常式註冊簡單的名稱。比如:
public delegate void MathMessage(string msg);
public event MathMessage ComputationFinished;
我們也可以顯式轉換一個事件處理常式為其關聯委託的一個執行個體。
9,Lambda 運算式(=>)可以應用於任何匿名方法可以應用的場合,它只是用更簡單的方法來寫匿名方法,徹底簡化了對.NET委託類型的使用。其使用方式為:定義參數列表,“=>”標記緊隨其後,然後就是運算式。比如:
List<int> evenNumbers = list.FindAll((int i) => ((i % 2) == 0));
Lambda運算式的參數既可以是顯式類型化的也可以是隱式類型化的。上面的列子是顯式類型化為 int,我們也可以省略 int 即隱式類型化。