本质上,委托是指向若干方法的类型安全的对象(类似c++函数指针)。一个委托维持有三项重要的信息:1,它要调用的方法的地址 2,方法的参数(如果有的话)3,方法的返回值(如果有的话)。和c++函数指针不同的是,.net 委托可以指向静态方法和实例方法。
首先来看看如何定义一个委托(使用关键字delegate)
- // 这个委托可以指向任何接收两个int参数并返回int值的方法
- //二元操作
- public delegate int BinaryOp(int x, int y);
你在声明这个BinaryOp委托的时候,编译器会为你生成这样的一个类:
- sealed class BinaryOp : System.MulticastDelegate
- {
- public BinaryOp(object target, uint functionAddress);
- public int Invoke(int x, int y);
- public IAsyncResult BeginInvoke(int x, int y,
- AsyncCallback cb, object state);
- public int EndInvoke(IAsyncResult result);
- }
其中,Invoke是核心方法,顾名思义,是用来调用委托中维持的每个方法。BeginInvoke() 和EndInvoke()用来异步调用当前的方法。这个需要你有多线程编程的背景,超出了本文要描述的范围。这里你只要理解委托其实暗中实现了本来要用多线程才能实现的功能。
待续……
初次认识委托,可能会觉得有点困惑。现在来看看一个完整的例子:
- namespace SimpleDelegate
- {
-
- // 这个委托可以指向任何接收两个int参数并返回int值的方法
- //二元操作
- public delegate int BinaryOp(int x, int y);
- // 该类包含BinaryOp要指向的方法
- //
- public class SimpleMath
- {
- public static int Add(int x, int y)
- { return x + y; }
- public static int Subtract(int x, int y)
- { return x - y; }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("***** Simple Delegate Example *****/n");
- // 创建一个指向SimpleMath.Add()的BinaryOp对象
- //
- BinaryOp b = new BinaryOp(SimpleMath.Add);
- // 调用Add()方法 ,间接 使用了delegate 对象.
- Console.WriteLine("10 + 10 is {0}", b(10, 10));
- Console.ReadLine();
- }
- }
- }