C#学习之委托
- 委托本质上是一个类,隐式继承自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 }