c#的委託其實是一個特殊的類,這個類是一個抽象的類,下面就是它在MSDN中的定義:
定義:
看來它從介面ICloneable, ISerializable繼承而來,所以在使用委託的時候
主要分為三步
1。聲明一個委託,比如是SomeDelegate,
2。產生委託 SomeDelegate的執行個體,將需要委託的方法作為參數傳給委託
3。調用這個委託執行個體。
委託可以與靜態繫結,也可以動態綁定,靜態繫結是與一個類的靜態方法綁定,動態綁定主要與一個類的執行個體中的方法進行綁定,注意紅色部分的區別。
如果一個委託只能調用一個方法,那麼這個委託就叫“單播委託”,否則就叫“多播委託”
多播委託的階層如下:
其定義如下:
看來多播是從單播繼承而來,又進行了適當地擴充。
所以多播的使用跟單播的方法一樣,同樣需要三步。參看上面的三步。
下面給一個代碼,裡面給出了單播與多播的樣本,同時示範了靜態繫結與動態綁定
using System;
namespace DelegateNiu
{
delegate string SomeDelegate(string someStringValue);
delegate void AnotherDelegate();
class SomeClass
{
public void SomeMethod()
{
Console.WriteLine("SomeClass.SomeMethod 動態方法被調用...");
}
//定義一個方法,該方法主要是為了示範多播委託
public void AnotherMetnod()
{
Console.WriteLine("SomeClass.AnotherMetnod 動態方法被調用...");
}
}
//
public class SomeApplication
{
private static string SomeMethod(string someStringMethod)
{
Console.WriteLine("SomeApplication.SomeMethod 靜態方法被調用 "+"參數為["+ someStringMethod+"]....");
return "["+ someStringMethod+"] ...";
}
public static void Main(string[] args)
{
Console.WriteLine("非靜態方法的調用,同時也是多播的示範 ");
//定義SomeClass的一個執行個體
SomeClass someclass=new SomeClass();
AnotherDelegate anotherdelegate1=new AnotherDelegate(someclass.SomeMethod);
AnotherDelegate anotherdelegate2=new AnotherDelegate(someclass.AnotherMetnod);
//AnotherDelegate anotherdelegate=anotherdelegate1+anotherdelegate2;
AnotherDelegate anotherdelegate=(AnotherDelegate)Delegate.Combine(anotherdelegate1,anotherdelegate2);
//多播的聯合可以使用“+”,也可以使用Combine方法,上面注釋的一句與使用Combine方法的效果一樣
anotherdelegate();
//開始靜態方法的調用
Console.WriteLine("靜態方法的調用");
SomeDelegate somedelegate=new SomeDelegate(SomeApplication.SomeMethod);
somedelegate("測試委託的靜態方法的綁定");
Console.ReadLine();
}
}
}