c# - 事件不是领域——我不明白

标签 c# events field

C# in depth (到目前为止是一本优秀的书),Skeet 解释说事件不是领域。我多次阅读此部分,但我不明白为什么这种区别会产生任何影响。

我是混淆事件和委托(delegate)实例的开发人员之一。在我看来,他们是一样的。两者不都只是一种间接形式吗?我们可以同时多播。一个事件被设置为一个字段作为速记……当然。但是,我们正在添加或删除处理程序。将它们堆叠起来以便在事件触发时调用。难道我们不能对委托(delegate)做同样的事情,将它们堆叠起来并调用 invoke 吗?

最佳答案

其他答案基本正确,但换个角度看:

I am one of those developers that confuse events and delegate instances. In my mind, they are the same.

俗话说只见树木不见森林。我所做的区别是事件处于比委托(delegate)实例字段更高的“语义级别”。事件告诉类型的消费者“嗨,我是那种喜欢在事情发生时告诉你的类型”。类型来源一个事件;这是其公共(public)契约(Contract)的一部分。

作为实现细节,该类如何选择跟踪谁有兴趣收听该事件,以及什么和何时告诉订阅者事件正在发生,是该类的业务。它恰好通常使用多播委托(delegate)来执行此操作,但这是一个实现细节。这是一个如此常见的实现细节,混淆两者是合理的,但我们确实有两个不同的东西:公共(public)表面和私有(private)实现细节。

同样,属性描述了对象的语义:客户有一个名字,所以 Customer 类有一个 Name 属性。您可能会说“他们的名字”是客户的属性,但您绝不会说“他们的名字”是客户的字段;那是特定类的实现细节,而不是关于业务语义的事实。属性通常作为字段实现是类机制的私有(private)细节。

关于c# - 事件不是领域——我不明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10367137/

相关文章:

c# - 通过 TCP/IP 发送 myObject

ios - View 可见部分的触摸事件 ios swift 4

visual-studio - 我应该在 Visual Studio 加载项中的何处附加解决方案或项目事件?

javascript - 如何为范围 slider 创建事件处理程序?

Javascript 无法隐藏某些 DIV

c# - `global variable` 和 `field` 之间的区别?

dataset - 如何将自定义指标从 App Insights 导入到 Power BI?

c# - WPF DataGrid 列标题排序箭头在更改其 View 集合源的源后消失

c# - 在 sql 中使用 udf vs 在 C# 代码中使用方法的性能

c# - 通过 .NET Core 应用程序将空间数据 (.shp) 上传到 PostGIS 数据库