- 委托本质上是一个类,隐式继承自System.MulticastDelegate类,该类维护一个带有链接的委托列表,在调用多播委托时,将按照委托列表的委托顺序而调用,该类还包括一个接受两个参数的构造器和3个重要的方法:BeginInvoke、EndInvoke、Invoke;
- MulticastDelegate 拥有一个带有链接的委托列表,该列表称为调用列表,它包含一个或多个元素。在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。.NET提供了简洁的语法来创建委托链:以+= 和-= 操作符分别进行绑定和解除绑定的操作;
-
- 一切在代码,不废话,其实,理解了委托类型和委托类型的变量就ok了,其实委托跟struct、Enum一样,都只是一个抽象类,你可以定义很多具体的类型,这些具体的类型才是真正意义上的委托类型
1 #define debug
2
3
4 using System;
5 using System.Collections.Generic;
6 using System.Linq;
7 using System.Text;
8 using System.IO;
9 using System.Threading;
10
11
12 namespace test
13 {
14 class DelegateEx
15 {
16 //定义一个委托类型。注意,CalculateDelegate只是一个类型,和你定义一个class、struct等是一样的,只是定义了一个类型;
17 //再次强调:这货不是委托,只是一个类型!只是这货也叫委托类型而已,是类型,不是委托!
18 //这个类型只有一个看点:表示了对其回调方法的签名——返回类型为void,两个int类型的参数;
19 //委托类型的变量进行实例化时,需要一个方法作为参数,这个参数就要符合这个方法签名,仅此而已;
20 //可以把委托理解成C++里的函数指针(只是函数指针没有多播/委托链这个概念)
21 public delegate void CalculateDelegate(int x, int y);
22
23
24 //声明一个CalculateDelegate类型的变量。用上一步定义好的类型来声明一个变量,仅仅是声明,还没有进行初始化
25 private static CalculateDelegate myDelegate;
26
27
28 //定义 void Add()方法;很明显,这个方法是符合委托类型CalculateDelegate声明的方法签名的
29 public static void Add(int x, int y)
30 {
31 Console.WriteLine(x + y);
32 }
33
34 //定义 void Subtract()方法
35 public static void Subtract(int x, int y)
36 {
37 Console.WriteLine(x - y);
38 }
39
40
41 static void Main(string[] args)
42 {
43 //对myDelegate进行实例化,可以简写成:myDelegate = Add;
44 //其实就是把Add方法挂到myDelegate的委托链上,也可以说是把Add绑定到myDelegate上
45 myDelegate = new CalculateDelegate(Add);
46
47 //把 Subtract 绑定到/挂到 myDelegate上
48 myDelegate += Subtract;
49
50 //把 Subtract 从 myDelegate上解除绑定,或者说把Subtract从myDelegate摘下来
51 myDelegate -= Subtract;
52
53 //调用委托,其实就是把对应的参数传进委托链里并依次调用委托链上的方法
54 myDelegate(100, 200);
55
56
57 //重新指定myDelegate的引用,就是把myDelegate的委托链清空,然后添加Add方法上去
58 myDelegate = Add;
59
60 //往myDelegate上添加方法
61 myDelegate += Subtract;
62
63 //调用
64 myDelegate(100,200);
65
66 Console.ReadKey();
67 }
68 }
69 }