11

F#(至少在 Visual Studio 2012 中)同时具有Control.ObservableControl.Event.

  • 它们有什么关系?
  • 什么时候应该用哪一个?
  • 两者之间有性能差异吗?

我也很想知道 .NET 的 Haskell 模块 / 包 / 特性IEnumerable/通过对 .NET 的反应式扩展IObservable实现的二元性对应于什么。

4

1 回答 1

9

IEvent要回答您问题的第一部分,和之间存在许多差异IObservable。之所以有两种相似的类型,是因为它们IEvent是为 F# 设计的(早期主要是出于兼容性原因而将其保留在那里),并且该IObservable类型后来被添加到 .NET 中(因此 F# 也添加了对它的支持)。以下是一些区别:

  • IEvent不支持删除事件处理程序,因此当您创建处理管道(组合mapfilter)然后调用RemoveHandler生成的事件时,它会留下一些附加处理程序(是的,这是一个泄漏,我们写了一篇关于它的更详细的论文)另一方面IObservable是能够删除处理程序。

  • 作为前一点的结果,IObservable关于有状态组合器的行为不同。例如,当您使用 时Event.scan,您可以将多个处理程序附加到结果事件,它们将看到相同的状态。IObservable为每个附加的处理程序创建一个“新状态”(除非您明确使用主题)。

在实际的 F# 编程中,这意味着:

  • IObservable如果您希望能够删除事件处理程序(使用RemoveHandlerAwaitObservable在 F# 异步工作流中使用时),您通常应该更喜欢。

  • 如果要声明事件(可从 C# 使用),则需要创建类型的属性,IEvent因此需要使用Event组合器。

正如评论中提到的,F# 模型深受函数响应式编程 (FRP) 的影响,这是一个最初在 Haskell 中开发的想法,因此您应该找到很多类似的库。F# 版本“不那么纯粹”,以便对 .NET 编程更实用。

于 2012-08-07T15:30:09.330 回答