看一个简单的例子:
//声明一个委托
delegate int myDelegateHandler(int a, int b);
public class A
{
//静态的处理方法
public static int M1(int a, int b)
{
int c = 0;
c = a + b;
return c;
}
}
//入口类
public class B
{
public static void Main()
{
//实例一个委托
myDelegateHandler mdh = new myDelegateHandler(A.M1);
//调用委托
int sum = mdh(2, 2);
Console.WriteLine(sum.ToString());
}
}
上面是一个非常简单的例子,具体的实现步骤:
1、 先声明个委托实例 ;
2、然后提供要处理的方法;
3、再实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法 不用加括号,实例化的过程就是装载方法的过程,就好像需要参数的构造函数一样)实例化后的委托对象就好比是c++中的指针,它本身就是封装了方法的对象;
4、最后我们调用委托对象就好比是调用了被封装方法本身,调用时的参数也就传给了被封装的方法。
5、需要注意的是 所声明的委托无论是 参数个数,参数类型,返回值类型 都要和所要封装的方法保持一致,当调用委托实例对象时,所传入的参数也要保持一致 ,否则会出现错误。
委托链
我们知道委托是对方法的封装,而且委托可以封装很多方法形成委托链,其实委托就好像是一个容器,他封装了我们想要实现的若干方法,当调用委托对象(相当于c++中的指针)时,就会顺序的执行它所封装的所有的方法,如果有返回值的话,往往返回的是最后一个被执行的方法的返回值,委托链的形成可以用"+="或"-="对不同的委托实例进行二元操作。
委托链实例:
//定义一个委托
public delegate void PrintHandler(string message);
public class PrintProvider1
{
public void Print(string msg)
{
Console.WriteLine( msg + "1111111");
}
}
public class PrintProvider2
{
public void Print(string msg)
{
Console.WriteLine( msg + "2222222");
}
}
class Delegate1
{
public static void StaticPrint(string msg)
{
Console.WriteLine(msg + "3333333");
}
public static void Main()
{
string s = "委托链";
PrintProvider1 pp1 = new PrintProvider1();
PrintProvider2 pp2 = new PrintProvider2();
//创建委托实例
PrintHandler prn1 = new PrintHandler(pp1 .Print );
PrintHandler prn2 = new PrintHandler(pp2 .Print );
PrintHandler prn3 = new PrintHandler(StaticPrint );
Console.WriteLine("委托实例prn1的打印结果");
prn1(s );
Console.WriteLine("委托实例prn2的打印结果");
prn2(s);
Console.WriteLine("委托实例prn1+prn2的打印结果");
PrintHandler prn = prn1 + prn2;
prn(s);
Console.WriteLine("委托实例prn1+prn2+prn3的打印结果");
prn += prn3;
prn(s);
Console.WriteLine("委托实例prn1+prn3的打印结果");
prn -= prn2;
prn(s);
Console.WriteLine("委托实例prn3的打印结果");
prn -= prn1;
prn(s);
Console.WriteLine("试图调用null委托会引发异常");
try
{
prn -= prn3;
prn(s);
}
catch (NullReferenceException ex)
{
Console.WriteLine(ex .Message );
}
Console.WriteLine("试图从null中移出委托是无效操作");
try
{
prn -= prn3;
}
catch (NullReferenceException ex)
{
Console.WriteLine(ex .Message );
}
Console.Read();
}
}
执行结果
委托实例prn1的打印结果
委托链1111111
委托实例prn2的打印结果
委托链2222222
委托实例prn1+prn2的打印结果
委托链1111111
委托链2222222
委托实例prn1+prn2+prn3的打印结果
委托链1111111
委托链2222222
委托链3333333
委托实例prn1+prn3的打印结果
委托链1111111
委托链3333333
委托实例prn3的打印结果
委托链3333333
试图调用null委托会引发异常
未将对象引用设置到对象的实例。
试图从null中移出委托是无效操作