c#的委托其实是一个特殊的类,这个类是一个抽象的类,下面就是它在MSDN中的定义:
定义:
看来它从接口ICloneable, ISerializable继承而来,所以在使用委托的时候
主要分为三步
1。声明一个委托,比如是SomeDelegate,
2。生成委托 SomeDelegate的实例,将需要委托的方法作为参数传给委托
3。调用这个委托实例。
委托可以与静态绑定,也可以动态绑定,静态绑定是与一个类的静态方法绑定,动态绑定主要与一个类的实例中的方法进行绑定,注意红色部分的区别。
如果一个委托只能调用一个方法,那么这个委托就叫“单播委托”,否则就叫“多播委托”
多播委托的层次结构如下:
其定义如下:
看来多播是从单播继承而来,又进行了适当地扩展。
所以多播的使用跟单播的方法一样,同样需要三步。参看上面的三步。
下面给一个代码,里面给出了单播与多播的示例,同时演示了静态绑定与动态绑定
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();
}
}
}