Skeet在C# in depth(迄今为止非常好的一本书)中解释说,事件不是 Realm 。我阅读了本节很多次,但我不明白为什么区别会有所不同。
我是混淆事件和委托(delegate)实例的开发人员之一。在我看来,它们是相同的。不仅是间接形式吗?我们可以同时组播。将事件设置为速记...字段。但是,我们正在添加或删除处理程序。将它们堆叠起来,以便在事件触发时被调用。我们不是对委托(delegate)做同样的事情,将它们堆叠起来并调用invoke吗?
最佳答案
其他答案基本上是正确的,但是这是另一种看待方式:
有一句老话说不见森林不见树木。我所做出的区别是事件比委托(delegate)实例的字段具有更高的“语义级别”。一个事件告诉消费者“您好,我是一个喜欢告诉您什么时候发生的类型”的类型。类型产生一个事件;这是其公共(public)契约(Contract)的一部分。
作为实现的详细信息,该类如何选择跟踪谁对监听该事件感兴趣,以及如何以及何时告诉订阅者该事件正在发生,这是该类的事情。它通常是使用多播委托(delegate)来完成的,但这是一个实现细节。如此常见的实现细节使得将两者混淆是合理的,但是我们确实确实有两个不同之处:公开的外观和私有(private)的实现细节。
类似地,属性描述对象的语义:客户具有名称,因此客户类具有Name属性。您可能会说“他们的名字”是客户的属性(property),但是您永远不会说“他们的名字”是客户的字段。那是特定类的实现细节,而不是有关业务语义的事实。通常将属性实现为字段是类机制的私有(private)细节。