十二、事件,委托,泛型委托,集合(泛型和非泛型),Lambda表達式(聲明委托,使用委托,簡單的委托示例,action<T>和func<t>委托,多播委托,匿名方法,Lambda表達式,參數,事件)
事件(Event)
事件是一種對象或類能夠提供通知的成員,客戶端可以通過提供事件處理程序為相應的事件可添加可執行代碼,事件可以理解為一種特殊的委托。
委托(Delegate)
委托是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變。C#中的委托類似於C、C++中的函數指針。
委托(Delegate)特別用於實現事件和回調方法。所有的委托(Delegate)都派生自 System.Delegate 類。
//委托的聲明、實例化和使用,該委托可用於引用帶有一個整型參數的方法,並返回一個整型值。 using System; delegate int NumberChanger(int n);namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() {return num; } static void Main(string[] args) { // 創建委托實例 NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); // 使用委托對象調用方法 nc1(25); Console.WriteLine("Value of Num: {0}", getNum()); nc2(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
多播委托
委托對象可使用 "+" 運算符進行合並。一個合並委托調用它所合並的兩個委托。只有相同類型的委托可被合並。"-" 運算符可用於從合並的委托中移除組件委托。
使用委托的這個有用的特點,可以創建一個委托被調用時要調用的方法的調用列表。這被稱為委托的 多播(multicasting),也叫組播。
泛型(Generic)委托
using System; using System.Collections.Generic; delegate T NumberChanger<T>(T n); namespace GenericDelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { // 創建委托實例 NumberChanger<int> nc1 = new NumberChanger<int>(AddNum); NumberChanger<int> nc2 = new NumberChanger<int>(MultNum); // 使用委托對象調用方法 nc1(25); Console.WriteLine("Value of Num: {0}", getNum()); nc2(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
action<T>和func<t>委托
Action<T>是沒有返回值得方法委托,Func<T>是有返回值的委托。返回值的類型,由泛型中定義的類型進行約束。
集合(Collection)
集合(Collection)類是專門用於數據存儲和檢索的類。
這些類提供了對棧(stack)、隊列(queue)、列表(list)和哈希表(hash table)的支持。大多數集合類實現了相同的接口。
常用的集合類有ArrayList(非泛型集合)、List(泛型集合)、HashTable(非泛型集合)、Dictionary(泛型集合)、
Queue(隊列,代表一個先進先出的對象集合)和Stack(堆棧,代表一個後進先出的對象集合)、SortedList(泛型集合)
匿名方法(Anonymous methods)
提供了一種傳遞代碼塊作為委托參數的技術。匿名方法是沒有名稱只有主體的方法。
在匿名方法中不需要指定返回類型,它是從方法主體內的 return 語句推斷的。
Lambda表達式
Lambda表達式是一個匿名函數,是一種高效的類似於函數式編程的表達式,Lambda簡化了開發中需要編寫的代碼量。
它可以包含表達式和語句,並且可用於創建委托或表達式目錄樹類型,支持帶有可綁定到委托或表達式樹的輸入參數的內聯表達式。
C#的Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀為“goes to”。語法如下:
形參列表=>函數體 Lambda運算符的左邊是輸入參數(如果有),右邊是表達式或語句塊。
十二、事件,委托,泛型委托,集合(泛型和非泛型),Lambda表達式(聲明委托,使用委托,簡單的委托示例,action<T>和func<t>委托,多播委托,匿名方法,Lambda表達式,參數,事件)