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

事件(Event)編程

事件是一種對象或類可以提供通知的成員,客戶端能夠經過提供事件處理程序爲相應的事件可添加可執行代碼,事件能夠理解爲一種特殊的委託。函數式編程

委託(Delegate)函數

委託是存有對某個方法的引用的一種引用類型變量。引用可在運行時被改變。C#中的委託相似於C、C++中的函數指針。spa

委託(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();
      }
   }
}

多播委託code

委託對象可以使用 "+" 運算符進行合併。一個合併委託調用它所合併的兩個委託。只有相同類型的委託可被合併。"-" 運算符可用於從合併的委託中移除組件委託。對象

使用委託的這個有用的特色,能夠建立一個委託被調用時要調用的方法的調用列表。這被稱爲委託的 多播(multicasting),也叫組播。blog

泛型(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運算符的左邊是輸入參數(若是有),右邊是表達式或語句塊。
相關文章
相關標籤/搜索