http://blog.sina.com.cn/s/blog_71f2bd7f0100qv6e.html
一 delegate、Delegate、MulticastDelegate的区别
1 Delegate:是一个抽象基类,它引用静态方法或引用类实例及该类的实例方法。然而,只有系统和编译器可以显式地从Delegate 类派生出委托类型。
2MulticastDelegate:是一个继承于Delegate的类,其拥有一个带有链表格式的委托列表,该列表称为调用列表,在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。平常我们声明一个delegate的类型,都是继承于MulticastDelegate类的(注意:不能显式地从此类进行派生。这点与Delegate类是一样的,只有系统和编译器也可以显示地进行派生)。
3 delegate 是一个C#关键字,用来定义一个新的委托类型(继承自MulticastDelegate类)。
示例说明
class Program
{
}
二 为什么有些场景会用到事件(event)呢?
其实有些场景的话,使用委托就可以解决了的,比如上面的示例。当然,如果一定要用event也可以,把
public static GreetingDelegate delegate1这句换成
public static event GreetingDelegate delegate1;
即加一个event关键字就可以了。
所以上面的理由只能说明一点:事件就是对委托类型的一种特殊封装。
但为什么还是会出现使用event关键字的场景呢,比如Form的Load事件等。
其真正的特殊性如下:
1 事件的设计是从面向对象的角度进行设计的。事件的触发,只能由事件的发行者负责,事件的订阅者只负责触发时执行什么动作。
2 用Reflector工具对上面的示例进行反编译,这句定义:public static eventGreetingDelegate delegate1;其实变成了:
private static GreetingDelegatedelegate1;//修饰符变为了private,这解释了为什么只能由事件的发行者负责触发调用
public static GreetingDelegatedelegate1;//这里的Public修饰符才是我们写代码时给事件定义的修饰符。
{
}
参考资料:
1 http://blog.youkuaiyun.com/chopper7278/archive/2008/10/25/3145000.aspx
2 http://msdn.microsoft.com/zh-cn/library/awbftdfh(v=VS.80).aspx
3 http://msdn.microsoft.com/zh-cn/library/system.delegate(v=VS.80).aspx