您的位置:首页 > 编程语言 > C#

重温C#2.0之委托(delegate,Delegate,MulticastDelegate)与事件(event)区别

2016-05-05 13:38 555 查看

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

{
//这里就是声明了一个新的委托类型GreetingDelegate。
publicdelegate void GreetingDelegate(string name);
publicstatic GreetingDelegate delegate1;

static voidMain(string[] args)

{
//这里声明了委托类型GreetingDelegate的变量delegate1,并注册两个委托到其调用列表中。

delegate1 += EnglishGreeting;

delegate1 += ChineseGreeting;
//这里进行调用,会依次同步调用注册的上面两个委托对应的方法。

delegate1("Cupid");
//这里的输出就能知道委托类型GreetingDelegate实际是继承自MulticastDelegate类。
Console.WriteLine(typeof(GreetingDelegate).BaseType.FullName);

}
static voidEnglishGreeting(string name)

{

Console.WriteLine("Hello {0}", name);

}
static voidChineseGreeting(string name)

{

Console.WriteLine("你好 {0}", name);

}

}
二 为什么有些场景会用到事件(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修饰符才是我们写代码时给事件定义的修饰符。

{

add{…}

remove{…}

}

参考资料:

1 http://blog.csdn.net/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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: