重温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
相关文章推荐
- c#多线程通信之委托(事件)
- C#中小数点后保留两位小数,四舍五入的函数及使用方法
- MarshalAs的使用
- C#运算符大全_各种运算符号的概述及作用
- C#中实现并发的几种方法的性能测试
- 探索C#之6.0语法糖剖析
- C#执行异步操作的几种方式比较和总结
- c#作业
- C#中的static
- C#中类的序列化和反序列化
- C#用代码默认让程序以管理员权限运行
- c#访问修饰符
- C#代码
- C#DataTable
- C#中正则表达式的3种匹配模式
- c# 日期时间格式24小时制
- Chapter 2 C#语句---异常语句
- C#写datatable到excel无模板
- 在C#中使用NPOI2.0操作Excel2003和Excel2007
- Conversion Between DataTable and List in C#