当我写.Subscribe
个表达式时,我经常发现Resharper为我选择了以下重载,位于mscorlib,版本= 4.0.0.0:
namespace System
{
public interface IObservable<out T>
{
IDisposable Subscribe(IObserver<T> observer);
}
}
这似乎与大多数重载非常不同,这些重载需要Action
,而且它来自mscorlib,而不是System.Reactive.*
,这是我期望大部分Reactive内容的地方。
这次超载有什么作用?
该如何使用?
IObserver<T>
与Action
的关系如何?
为什么mscorlib会出现这种单一重载?
答案 0 :(得分:5)
要明确的是,这不是一个过载,这真的是Rx的核心。所有其他Subscribe
方法以及所有其他操作符,您已经习惯的是最终调用它的扩展方法。
如果您查看早期文档或Rx,您会看到创建者将其视为LINQ的基于推送的一面。所以很多东西都是你在LINQ中看到的镜像。 IObservable
是IEnumerable
的镜像,IObserver
是IEnumerator
的镜像。
然而,因为push与pull相反,所以Rx版本与其基于pull的版本相反:
IEnumerable
定义了一种产生IEnumerator
的方法。 IObservable
定义了接纳 IObserver
。IEnumerator.MoveNext()
+ IEnumerator.Current
视为一个操作,则可以通过以下三种方式之一返回:返回下一个元素,到达收集结束或抛出异常。同样,IObserver
必须处理三种情况:下一个元素(OnNext
),流末尾(OnCompleted
)或异常(OnError
)。 Subscribe
更熟悉的“重载”实际上只是扩展方法,如下所示:
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext)
{
return Subscribe(onNext, e => {/*onError */}, () => {/*onCompleted*/);
}
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError, Action onCompleted)
{
source.Subscribe(new AnonymousObserver<T>(onNext, onError, onCompleted));
}
答案 1 :(得分:1)
如果你看IObserver
,你可能会看到原因。界面包含三种方法(或Action
s),最多&#34;使用&#34;他们是OnNext
。
现在让我们看看Action
here的重载实现情况。扩展方法通过将提供的IObserver
作为Action
语义传递,实际为您生成OnNext
。
如果您希望处理Action
和OnError
通知,则可以为所有接口方法实现提供OnCompleted
。