1.委托定义(摘自MSDN):
委托是安全封装方法的类型,类似于C和C++中的函数指针。与C函数指针不同的是,委托是面向对象的、类型安全的和可靠的。
委托的类型由委托的名称确定。
2.委托的声明:
- 无参的委托
public delegate void DelNoParams();
- 单参的委托
public delegate void DelOneParams(object obj);
注:使用delegate定义委托,可以根据需要设定返回值类型,设定参数的个数及每个参数的类型。
3.委托的使用:
(1).通过委托调用方法
委托通常使用封装后的方法名称或者匿名方法构造。
对委托进行实例化后,委托会将需要的方法调用传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方。
1 public delegate void DelOneParams(string obj);
2
3 private static void SayHello(string name)
4 {
5 Console.WriteLine("Hello:{0}", name);
6 }
7
8 static void Main(string[] args)
9 {
10 DelOneParams del = new DelOneParams(SayHello);
11 del("程序员");
12
13 Console.ReadLine();
14 }
注:委托也可以如下调用:
1 DelOneParams del = SayHello;
2 del("程序员");
由于实例化的委托是一个对象,因此可以作为参数传递或分配给一个属性。这允许方法作为参数接受委托并在之后调用委托,这称为异步回调。
异步回调是在长进程完成时通知调用方法的常用方法,当以这种方式使用委托时,使用委托的代码不需要知道要使用的实现方法。
(MSDN看到的话,果然不是人类能看懂的。。。。)
(2).将委托作为参数传递
回调的一个常见用途是将委托作为函数的参数进行传递:
例子中,如果需要将方法GetResult作为参数进行传递,可以先声明具有相同签名的委托,通过委托代入方法的方式进行方法传递
1 //声明委托:单参无返回
2 public delegate void DelOneParams(string obj);
3 //具有和委托具有相同签名的方法
4 public static void GetResult(string str)
5 {
6 Console.WriteLine(str);
7 }
8 //将委托作为参数进行传递
9 public static void MethodWithCallback(int param1, int param2, DelOneParams callback)
10 {
11 callback("The Result is " + (param1 + param2).ToString());
12 }
结果:
1 static void Main(string[] args)
2 {
3 MethodWithCallback(3, 4, GetResult);
4 //-->The Result is 7
5 Console.ReadLine();
6 }
4.多播委托:
委托可以调用多个方法,若需要向委托的方法列表(调用列表)中添加其他方法,只需要使用操作符:“+=”或“+”。
1 //声明委托
2 public delegate void Del();
3
4 //方法1
5 public static void method1()
6 {
7 Console.WriteLine("调用了第一个方法:method1");
8 }
9 //方法2
10 public static void method2()
11 {
12 Console.WriteLine("调用了第二个方法:method2");
13 }
调用多播委托(委托+、-方法):
1 static void Main(string[] args)
2 {
3 Del del = new Del(method1);
4 del += method2;
5 del();
6
7 Console.ReadLine();
8 }
9 //输出:
10 //-->调用了第一个方法:method1
11 //-->调用了第二个方法:method2
还可以这样调用多播委托(委托+、-委托):
1 Del del1 = method1;
2 Del del2 = method2;
3 Del delAll = del1 + del2 + del1;
4 delAll();
5 //输出:
6 //-->调用了第一个方法:method1
7 //-->调用了第二个方法:method2
8 //-->调用了第一个方法:method1
注:1.委托可以多次+、-同一个方法;
2.委托“+”方法时,方法向后添加;委托“-”方法时,方法从后先移除最后添加的
多播委托广泛用于事件处理中,后续再进行介绍。