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.觀察者模式