C# 泛型委托學(xué)習(xí)經(jīng)驗(yàn)淺析
C# 泛型委托學(xué)習(xí)之前首先來看看什么是C# 委托,C# 委托是一種引用方法的類型。一旦為委托分配了方法,C# 委托將與該方法具有完全相同的行為。委托方法的使用可以像其他任何方法一樣,具有參數(shù)和返回值,如下面的示例所示:與委托的簽名(由返回類型和參數(shù)組成)匹配的任何方法都可以分配給該委托。這樣就可以通過編程方式來更改方法調(diào)用,還可以向現(xiàn)有類中插入新代碼。只要知道委托的簽名,便可以分配自己的委托方法。
C# 泛型委托代碼
- public delegate int PerformCalculation(int x, int y);
將方法作為參數(shù)進(jìn)行引用的能力使委托成為定義回調(diào)方法的理想選擇。例如,可以向排序算法傳遞對(duì)比較兩個(gè)對(duì)象的方法的引用。分離比較代碼使得可以采用更通用的方式編寫算法。
C# 委托具有以下特點(diǎn):
◆C# 委托類似于 C++ 函數(shù)指針,但它是類型安全的。
◆C# 委托允許將方法作為參數(shù)進(jìn)行傳遞。
◆C# 委托可用于定義回調(diào)方法。
◆C# 委托可以鏈接在一起;例如,可以對(duì)一個(gè)事件調(diào)用多個(gè)方法。
◆方法不需要與委托簽名精確匹配。
◆C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數(shù)傳遞,以代替單獨(dú)定義的方法。
C# 泛型委托的理解及應(yīng)用:
C# 委托可以定義自己的類型參數(shù)。引用泛型委托的代碼可以指定類型參數(shù)以創(chuàng)建已關(guān)閉的構(gòu)造類型,就像實(shí)例化泛型類或調(diào)用泛型方法一樣,如下例所示:
C# 泛型委托代碼
- public delegate void Del﹤T﹥(T item);
- public static void Notify(int i) { }
- Del﹤int﹥ m1 = new Del﹤int﹥(Notify);
C# 2.0 版具有稱為方法組轉(zhuǎn)換的新功能,此功能適用于具體委托類型和泛型委托類型,并使您可以使用如下簡化的語法寫入上一行:
C# 泛型委托代碼
- Del﹤int﹥ m2 = Notify;
在泛型類內(nèi)部定義的委托使用泛型類類型參數(shù)的方式可以與類方法所使用的方式相同。
C# 泛型委托代碼
- class Stack﹤T﹥
- {
- T[] items;
- int index;
- public delegate void StackDelegate(T[] items);
- }
引用委托的代碼必須指定包含類的類型變量,如下所示:
C# 泛型委托代碼
- private static void DoWork(float[] items) { }
- public static void TestStack()
- {
- Stack﹤float﹥ s = new Stack﹤float﹥();
- Stack﹤float﹥.StackDelegate d = DoWork;
- }
根據(jù)典型設(shè)計(jì)模式定義事件時(shí),泛型委托尤其有用,因?yàn)榘l(fā)送方參數(shù)可以為強(qiáng)類型,不再需要強(qiáng)制轉(zhuǎn)換成 Object,或反向強(qiáng)制轉(zhuǎn)換。
C# 泛型委托代碼
- delegate void StackEventHandler﹤T, U﹥(T sender, U eventArgs);
- class Stack﹤T﹥
- {
- public class StackEventArgs : System.EventArgs { }
- public event StackEventHandler﹤Stack﹤T﹥,
- StackEventArgs﹥ stackEvent;
- protected virtual void OnStackChanged(StackEventArgs a)
- {
- stackEvent(this, a);
- }
- }
- class SampleClass
- {
- public void HandleStackChange﹤T﹥(Stack﹤T﹥ stack,
- Stack﹤T﹥.StackEventArgs args) { }
- }
- public static void Test()
- {
- Stack﹤double﹥ s = new Stack﹤double﹥();
- SampleClass o = new SampleClass();
- s.stackEvent += o.HandleStackChange;
- }
C# 泛型委托的相關(guān)內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C# 泛型委托有所幫助。
【編輯推薦】