jmc*_*mcg 14 .net c# ienumerable system.reactive
你如何确定方法是否应该返回IEnumerable<T>或IObservable<T>?
为什么我会选择一种范式而不是另一种?
Tim*_*lds 24
IEnumerable<T>
T的IObservable<T>
T被"推"给你为什么我会选择一种范式而不是另一种?
你通常不会 "选择"一种范式而不是另一种范式.通常一个人自然而然地作为正确的选择脱颖而出,另一个没有任何意义.
请考虑以下示例:
一个巨大的CSV文本文件在每一行上都有一个项目,您希望一次处理一个项目,而无需一次将整个文件加载到内存中: IEnumerable<List<string>>
您正在运行HTTP Web服务器: IObservable<WebRequest>
您希望以广度优先的方式获取树数据结构的节点: IEnumerable<Node>
您正在响应用户界面按钮点击: IObservable<Click>
在每个例子中(特别是IObservable<T>案例),使用其他类型是没有意义的.
IObservable<T> 至 IEnumerable<T>如果某些东西是自然的,IObservable<T>但你想要像处理它一样处理它IEnumerable<T>,你可以用这种方法做到:
IEnumerable<T> Observable.ToEnumerable(this IObservable<T>)
Run Code Online (Sandbox Code Playgroud)
T被"推"时IObservable<T>,它会被发送到队列中.T出一个IEnumerable<T>,它会阻塞,直到队列不为空,然后出列.IEnumerable<T> 至 IObservable<T>如果某些东西是自然的,IEnumerable<T>但你想要像处理它一样处理它IObservable<T>,你可以用这种方法做到:
IObservable<T> Observable.ToObservable(this IEnumerable<T>)
Run Code Online (Sandbox Code Playgroud)
T" IEnumerable<T>.T,它就会通过"向你推"它IObservable<T>.使用IObservable<T>,如果你想推数据到你的方法的调用者在您方便的.您可以通过调用做到这一点OnNext()上Observers通过注册的兴趣Subscribe().
使用IEnumerable<T>,如果你想你的方法的调用者拉的数据在他们方便的.他们这样做是通过呼叫GetEnumerator()获取IEnumerator和调用MoveNext()和Current(foreach编译到此).
更新:也许最好给出一些例子:
在银行中返回货币价格的函数是一个很好的候选者IObservable<T>.这里的信息对时间至关重要.作为此数据的服务器,您需要尽快将其发送到客户端.客户端不知道该数据何时准备就绪.所以你把它推给他们.
返回特定金融工具的有效交易日并用于填充日历控件上的停电天数的函数是IEnumerable的良好候选.这些数据很少改变,客户端(设置控件)更喜欢按照它指示的速度消耗它.
IObservable<T>是一个专用接口,可用于发布/订阅和各种其他模式。您会知道何时需要返回IObservable<T>,因此如果没有特定需要,则返回IEnumerable<T>。
更新评论中的问题
基本上,IObservable<>使用“推”机制,而 IEnumerable<> 使用“拉”机制。如果您只想获取不需要通知订阅者更改(推送)的数据列表,那么您可以使用IEnumerable. 如果订阅者(窗口、控件、其他客户端程序/例程等)需要知道数据何时更改,则使用IObservable<>. 一个示例是使用IObservable子线程更新 Windows 程序中的主 UI 线程(通常,如果没有花哨的步骤,这是无法完成的。请阅读 .NET Reactive Extensions (Rx.NET)。
| 归档时间: |
|
| 查看次数: |
4943 次 |
| 最近记录: |