[C#]C#學習筆記-委托,事件
C#學習筆記-委托,event
羅朝輝(http://www.rzrgm.cn/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 即隱式類型化。
浙公網安備 33010602011771號