標籤:數列 line 派生 定義 列表 ons ogr 函數返回 class
委託
C# 中的委託(Delegate)類似於 C 或 C++ 中函數的指標。委託(Delegate) 是存有對某個方法的引用的一種參考型別變數。引用可在運行時被改變。
委託(Delegate)特別用於實現事件和回調方法。所有的委託(Delegate)都派生自 System.Delegate 類。
聲明委託(Delegate)
委託聲明決定了可由該委託引用的方法。委託可指向一個與其具有相同標籤的方法。
1 delegate 函數傳回型別 委託名 (<方法參數列表>);
執行個體化委託(Delegate)
委派物件必須使用 new 關鍵字來建立,且與一個特定的方法有關。當建立委託時,傳遞到 new 語句的參數就像方法調用一樣書寫,但是不帶有參數。
1 委託類型 執行個體名 = new 委託類型 (<註冊方法>);
通過委託執行個體來調用方法,執行委託執行個體就等同於執行註冊方法。
匿名函數初始化委託
為初始化委託而專門定義方法較為麻煩,通常調用委託執行個體初始化時賦值的方法,而不直接調用方法本身。
格式如下:
1 delegate 委託(函數)傳回型別 委託類型(函數參數列表);2 3 委託類型 委託執行個體= new 委託類型(delegate(<函數參數列表:類型 形參名,類型 形參名...>)4 {5 //函數體6 });
或者省去new關鍵字。
1 delegate 委託(函數)傳回型別 委託類型(函數參數列表);2 3 委託類型 委託執行個體= delegate(<函數參數列表:類型 形參名,類型 形參名...>)4 {5 //函數體6 };
委託的多播(Multicasting of a Delegate)
委派物件可使用 "+" 運算子進行合并。一個合并委託調用它所合并的兩個委託。只有相同類型的委託可被合并。"-" 運算子可用於從合并的委託中移除組件委託。
使用委託的這個有用的特點,您可以建立一個委託被調用時要調用的方法的調用列表。這被稱為委託的 多播(multicasting),也叫組播。
利用多播可以將委託中的函數類似資料一樣擴充或消減。
1 namespace _9_delegate_2_20170801 2 { 3 class TestDelegate 4 { 5 public static void PrintfA() 6 { 7 Console.WriteLine("PrintfA !"); 8 } 9 10 public static void PrintfB()11 {12 Console.WriteLine("PrintfB !");13 }14 }15 delegate void Mydelegate();16 17 class Program18 {19 static void Main(string[] args)20 {21 // 建立委託執行個體22 Mydelegate d;23 Mydelegate da = new Mydelegate(TestDelegate.PrintfA);24 Mydelegate db = new Mydelegate(TestDelegate.PrintfB);25 d = da;26 d += db;27 // 調用多播28 Console.WriteLine("調用委託執行個體d ==da+db:");29 d();30 d -= da;31 Console.WriteLine("調用委託執行個體d ==db:");32 d();33 }34 }35 }
委託多播例子
委託的好處
1、操作函數更加靈活,就像使用變數一樣方便,具有動態性,可避免程式中大量的使用分支語句。
2、與C++,C中的函數指標相比,委託是物件導向、型別安全、可靠的受控對象。委託能保證指向一個安全有效不會越界的儲存函數的地址。
3、與C++,C中的函數指標相比,指標只能指向靜態函數,委託可以引用靜態函數也可以引用非靜態成員函數。
當程式必須調用一個方法來執行某個操作,但編譯無法確定是什麼方法時,就可以使用委託。
C#_委託Delegate