1. 程式人生 > >十二、事件,委托,泛型委托,集合(泛型和非泛型),Lambda表達式(聲明委托,使用委托,簡單的委托示例,action<T>和func<t>委托,多播委托,匿名方法,Lambda表達式,參數,事件)

十二、事件,委托,泛型委托,集合(泛型和非泛型),Lambda表達式(聲明委托,使用委托,簡單的委托示例,action<T>和func<t>委托,多播委托,匿名方法,Lambda表達式,參數,事件)

multicast new 調用方法 多播 ted 被調用 輸入參數 pac cas

事件(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表達式,參數,事件)