什么是委托(delegate)

  委托(delegate),刚开始学的时候觉得很难理解,我们可以把它看作是一个修饰符,用来修饰一个类的类型,就像public, static等一样。定义一个delegate类和我们平时定义类差不多。我们来看一下我们经常用到的EventHandler类的定义,它是.NET中的一个类:

 

Code
public delegate void EventHandler(object sender, EventArgs e);

 

  上面的代码可以看成是定义一个delegate的类,类的名字是EventHandler。下面是我定义一个普通的类,看看它们之间有什么区别:

 

Code
public class UserInfo{}

 

  可以看到,delegate的类和普通的类的定义还是有比较大的不同的,这只要记住它的格式就行了。我们再看看创建类的实例:

 

Code
UserInfo userInfo = new UserInfo();
EventHandler handler
= new EventHandler(MethodName);

 

   从代码中可以,它和创建普通的类的实例没什么不同,只是它必须要有参数,而且只能有一个。这个参数很特别,它不是什么类型的参数,而是方法的名字。方法有很多的类型(这里不是指public,static等等这种类型),就像参数也有很多种类型一样,它总不能是无论什么样的方法都接受吧。那是当然的了,它到底能接受什么样的方法呢。这就需要用到修饰了。

  上前面,我们看到了定义delegate的类有很大的不同。在它的后面多了一个void,它的前面也多了两个参数,这些是干什么用的呢?可能你已经想到了,就是用来修饰方法的类型的。它限定了方法的返回值必须是void,它的参数是(object sender, EventArgs e),只要符合这两个要求的方法都可以传给它。

上面的代码还可以简单地写成:EventHandler handler= MethodName;。这样赋值的话,它的实例像不像是一个方法指针了呢?赋值后我们就能像调用方法一样调用它了,如:handler(sender, e); ,调用handler,就相当于是调用了方法MethodName。通过handler调用MethodName的过程就叫做代理,也可以叫做委托,也就是MethodName把使用权委托给handler。

你可能感兴趣的:(delegate)