Jon*_*eet 16
简答:看看我关于这个主题的文章.更长的回答:
事件是代表之上的模式.它们是发布者/订阅者模式(也称为观察者模式)的实现,使用委托作为表示订阅的手段.
每当你看到类似的东西:
public event EventHandler Foo;
Run Code Online (Sandbox Code Playgroud)
你应该考虑两种方法:
public void AddFooHandler(EventHandler handler) { ... }
public void RemoveFooHandler(EventHandler handler) { ... }
Run Code Online (Sandbox Code Playgroud)
来自外部的客户可以做的就是订阅和取消订阅.特别地,客户端可以不提高(被提供用于该目的,而不需要单独的方法)的情况下本身也不能"替换"或移除其他订阅.
Eri*_*ert 10
到目前为止,答案都非常好,但他们都探索了这种关系的"机械"方面.我看一下有点不同.
想想微波炉上的"开始"按钮.该按钮为微波炉的用户提供抽象,按钮具有某些属性.它有大小,有位置,有文字,按下时有动作.
甲Button在C#程序类还提供了一个抽象,它类似地具有某些属性.与微波按钮一样,它具有大小和位置以及文本和按下时的动作.
大小和位置由整数表示,文本由字符串表示.人们不会说微波炉按钮它"具有表示其大小和位置的整数以及表示其文本的字符串".对于软件按钮,它具有大小和位置以及文本的事实是按钮的语义.大小和位置以及文本由整数和字符串表示的事实是关于按钮构建的机制的事实,而不是关于按钮的目的或逻辑上它向世界呈现什么信息的事实.
软件按钮表示被点击作为事件的动作; 事件说"这是一个可以点击的东西".单击按钮时实际响应的代理集合是该机制的一部分.
一个属性告诉你关于一个类的事实.它可能通过给你一个字符串来实现,但不要将字符串与属性混淆.该字符串是机制,物业使用的事实传达给消费者.一个事件也告诉你一个关于类事实.它通过委托来实现,因为委托是构建事件的机制.