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 }

 

 

 

 

 

posted @ 2012-09-06 10:51  仙外仙  阅读(232)  评论(0编辑  收藏  举报