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();
}
}
}
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();
}
}
}