第505篇-Delegate和Event异同--(目录篇1:共6篇)

开篇:.NET中的Delegate和Event是使用最为频繁的关键字之一,在程序设计中,非常方便的可以实现特定的功能,基于学习的目的,本系列特地总结几篇博文,说明Delegate和Event的异同。

1 观察者模式(Mouse, Cat, Host)

2 上班玩游戏--事件模式

3 Clock 动态模式

4 用方法限制事件只能被单个订阅者订阅

5 用事件访问器限制只能被单个订阅者订阅

 

下面是Delegate和Event的一些异同:

1) 事件可以定义在Struct, Class, Interface里, delegate可以放在类里面进行申明(不能放在Interface里面)也可以放在整个命名空间中进行申明, 但是事件是不能脱离类而存在的. 如果不要event关键字,原来的程序可以实现同样的功能。主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该由事件发布者触发,而不应该由客户端(客户程序)来触发.Delegate和Event区别:Delegate是Method指针,Event是特殊的Delegate,你不想在声明delegate的类之外调用delegate,还有,除了声明delegate的类,其它类只能订阅(Subscribe,即+=)或取消订阅(Unsubscribe,即-=)时就给delegate加个event关键字, event就是某个类发生一些事情时,通知对该事件感兴趣的客户的一种手段.

事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用

2)  Enum: 它是直接从System.Enum继承的,System.Enum又是继承自System.ValueType。但是枚举类型不可以定义方法、属性或者事件

3) 事件是Observe(观察者)设计模式的一种实现,以多播委托为底层支持,事件的声明只负责发布以及它的两个注册方法.

4)但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用.

5) Delegate调用三步曲:

a.生成自定义代理类:delegate int MyDelegate();

b.然后实例化代理类:MyDelegate d = new MyDelegate(MyClass.MyMethod);

c.最后通过实例对象调用方法:int ret = d();

7 ) 为什么委托定义的返回值通常都为void?尽管并非必需,但是我们发现很多的委托定义返回值都为void,为什么呢?这是因为委托变量可以供多个订阅者注册,如果定义了返回值,那么多个订阅者的方法 都会向发布者返回数值,结果就是后面一个返回的方法值将前面的返回值覆盖掉了,因此,实际上只能获得最后一个方法调用的返回值。可以运行下面的代码测试一 下. 发布者根本不关心谁订阅了它的事件、为什么要订阅,更别说订阅者的返回值了,所以返回订阅者的方法返回值大多数情况下根本没有必要。

8)   其真正的特殊性如下:1 事件的设计是从面向对象的角度进行设计的。事件的触发,只能由事件的发行者负责,事件的订阅者只负责触发时执行什么动作。

2 用Reflector工具对上面的示例进行反编译,这句定义:public static event GreetingDelegate delegate1;其实变成了: private static GreetingDelegate delegate1;//修饰符变为了private,这解释了为什么只能由事件的发行者负责触发调用.在接下来的几篇博文中,我将介绍几个例子,讲解Delegate的异同.

转载于:https://www.cnblogs.com/shanghaijimzhou/archive/2013/03/04/2943070.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值