深入C#中的委托和事件
2012-11-29 23:23
253 查看
为什么要使用事件而不是委托变量?
在C#中的委托和事件 中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因。主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该由事件发布者触发,而不应该由客户端(客户程序)来触发。这句话是什么意思呢?请看下面的范例:
NOTE:注意这里术语的变化,当我们单独谈论事件,我们说发布者(publisher)、订阅者(subscriber)、客户端(client)。当我们讨论Observer模式,我们说主题(subject)和观察者(observer)。客户端通常是包含Main()方法的Program类。
class Program { static void Main(string[] args) { Publishser pub = new Publishser(); Subscriber sub = new Subscriber(); pub.NumberChanged += new NumberChangedEventHandler(sub.OnNumberChanged); pub.DoSomething(); // 应该通过DoSomething()来触发事件 pub.NumberChanged(100); // 但可以被这样直接调用,对委托变量的不恰当使用 } } // 定义委托 public delegate void NumberChangedEventHandler(int count); // 定义事件发布者 public class Publishser { private int count; public NumberChangedEventHandler NumberChanged; // 声明委托变量 //public event NumberChangedEventHandler NumberChanged; // 声明一个事件 public void DoSomething() { // 在这里完成一些工作 ... if (NumberChanged != null) { // 触发事件 count++; NumberChanged(count); } } } // 定义事件订阅者 public class Subscriber { public void OnNumberChanged(int count) { Console.WriteLine("Subscriber notified: count = {0}", count); } }
上面代码定义了一个NumberChangedEventHandler委托,然后我们创建了事件的发布者Publisher和订阅者Subscriber。当使用委托变量时,客户端可以直接通过委托变量触发事件,也就是直接调用pub.NumberChanged(100),这将会影响到所有注册了该委托的订阅者。而事件的本意应该为在事件发布者在其本身的某个行为中触发,比如说在方法DoSomething()中满足某个条件后触发。通过添加event关键字来发布事件,事件发布者的封装性会更好,事件仅仅是供其他类型订阅,而客户端不能直接触发事件(语句pub.NumberChanged(100)无法通过编译),事件只能在事件发布者Publisher类的内部触发(比如在方法pub.DoSomething()中),换言之,就是NumberChanged(100)语句只能在Publisher内部被调用。
大家可以尝试一下,将委托变量的声明那行代码注释掉,然后取消下面事件声明的注释。此时程序是无法编译的,当你使用了event关键字之后,直接在客户端触发事件这种行为,也就是直接调用pub.NumberChanged(100),是被禁止的。事件只能通过调用DoSomething()来触发。这样才是事件的本意,事件发布者的封装才会更好。
就好像如果我们要定义一个数字类型,我们会使用int而不是使用object一样,给予对象过多的能力并不见得是一件好事,应该是越合适越好。尽管直接使用委托变量通常不会有什么问题,但它给了客户端不应具有的能力,而使用事件,可以限制这一能力,更精确地对类型进行封装。
NOTE:这里还有一个约定俗称的规定,就是订阅事件的方法的命名,通常为“On事件名”,比如这里的OnNumberChanged。
相关文章推荐
- 初次接触WIN FORM,深入事件、委托、方法 ,深入看不到的C#探索。
- 深入理解C#编程中的组件-事件-委托
- C#综合揭秘——深入分析委托与事件
- C#综合揭秘——深入分析委托与事件
- C#综合揭秘——深入分析委托与事件(中)
- C#综合揭秘——深入分析委托与事件
- C#综合揭秘——深入分析委托与事件(上) 推荐
- 深入理解C#---2.事件?委托?傻傻分不清楚
- C#综合揭秘——深入分析委托与事件(中)
- C#综合揭秘——深入分析委托与事件(下)
- 深入理解C#中的委托和事件:委托的定义
- C#综合揭秘——深入分析委托与事件
- 深入理解C#编程中的组件-事件-委托
- C#综合揭秘——深入分析委托与事件
- C#综合揭秘——深入分析委托与事件
- 深入分析委托与事件_C#
- C#实战揭秘:深入解析委托与事件的由来
- Modern C# 系列课程笔记 第11节 深入委托和事件
- 深入理解C#中的委托和事件
- 深入理解C#编程中的组件-事件-委托