C#委托
1.委托定義:委托是一種數據類型,和類是同級別的,delegate可以直接看着關鍵字class,我們可以直接將delegate看着為class,區別為class里存放的是一系列方法,屬性,字段,事件,索引。而delegate里存放的是一系列具有相同類型參數和返回回類型的方法的地址的地址。可以看着為儲存方法的載體。
2. 委托的聲明:delegate <函數返回類型> 委托名(函數參數) 例:public delegate void myDelegate(string name);
3.委托的實例化:
(1) <委托名> 實例化名 = new <委托名>(注冊函數) 注意:注冊函數不包含參數,或者可以直接將一個注冊函數賦值給委托
例 myDelegate delegateinstance = new myDelegate(method);
(2)匿名方法實例化委托
<委托類型> <實例化名>=delegate(<函數參數>){函數體};
(3)使用lamda表達式實例化委托
實例化例子如下所示:
class Program { //聲明委托 delegate int MyDelegate(int x, int y); static void Main(string[] args) { //實例化委托 //1、使用new關鍵字 MyDelegate _myDelegate = new MyDelegate(GetSum); //2、使用匿名方法 MyDelegate myDelegate = delegate(int x, int y) { return x + y; }; //3、使用Lambda表達式 MyDelegate myDelegateLambda = (int x, int y) => { return x + y; }; } static int GetSum(int x, int y) { return x + y; } }
4.多播委托
實例化委托時必須將一個匹配函數注冊到委托上來實例化一個委托對象,但是一個實例化委托不僅可以注冊一個函數還可以注冊多個函數,注冊多個函數后,在執行委托的時候會根據注冊函數的注冊先后順序依次執行每一個注冊函數。
多播委托實際上形成委托鏈 ------------》函數注冊委托的原型:<委托類型> <實例化名>+=或者-=new <委托類型>(<注冊函數>)
如果在委托注冊了多個函數后,如果委托有返回值,那么調用委托時,返回的將是最后一個注冊函數的返回值。
注意:委托必須先實例化以后,才能使用+=注冊其他方法。如果對注冊了函數的委托實例從新使用=號賦值,相當於是重新實例化了委托,之前在上面注冊的函數和委托實例之間也不再產生任何關系。
5.泛型委托
委托也支持泛型的使用 泛型委托原型:delegate <T1> <委托名><T1,T2,T3...> (T1 t1,T2 t2,T3 t3...)
6.內置泛型委托
delegate void Action<T1,T2,T3>:泛型委托是可以達到16個參數的返回值的委托。委托無返回值
delegate Tresult Fun<T1,T2,Tresult>:Fun是內置泛型委托,具有返回值
delegate bool Predicate<T>(T obj); 內置泛型委托,返回bool值
7.委托的清空
1、在類中申明清空委托方法,依次循環去除委托引用。方法如下: public class TestDelegate { public DelegateMethod OnDelegate; public void ClearDelegate() { while (this.OnDelegate != null) { this.OnDelegate -= this.OnDelegate; } } } 2、如果在類中沒有申明清空委托的方法,我們可以利用GetInvocationList查詢出委托引用,然后進行去除。方法如下: TestDelegate test = new TestDelegate(); if (test.OnDelegate != null) { System.Delegate[] dels = test.OnDelegate.GetInvocationList(); for (int i = 0; i < dels.Length; i++) { test.OnDelegate -= dels[i] as DelegateMethod; } }
8.委托的用處
1.高內聚低耦合
2.觀察者模式