Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net IObservable.Subscribe(IObserver<;T>;observer)重载用于什么?_.net_System.reactive - Fatal编程技术网

.net IObservable.Subscribe(IObserver<;T>;observer)重载用于什么?

.net IObservable.Subscribe(IObserver<;T>;observer)重载用于什么?,.net,system.reactive,.net,System.reactive,当我编写.Subscribe表达式时,我经常发现Resharper为我选择了以下重载,位于mscorlib中,版本=4.0.0.0: namespace System { public interface IObservable<out T> { IDisposable Subscribe(IObserver<T> observer); } } 名称空间系统 { 可观察的公共接口 { IDisposable Subscribe(IObserver-o

当我编写
.Subscribe
表达式时,我经常发现Resharper为我选择了以下重载,位于mscorlib中,版本=4.0.0.0:

namespace System
{
  public interface IObservable<out T>
  {
    IDisposable Subscribe(IObserver<T> observer);
  }
}
名称空间系统
{
可观察的公共接口
{
IDisposable Subscribe(IObserver-observer);
}
}
这似乎与大多数重载非常不同,重载采取了
操作
,而且它来自mscorlib,而不是
System.Reactive.
,这就是我所期望的大多数反应性内容

这个过载是做什么的? 如何使用?
IObserver
Action
的关系如何?
为什么mscorlib中会出现这种单一重载?

如果您查看
IObserver
,您可能会看到原因。该界面包含三种方法(或
Action
s),其中使用最多的是
OnNext

现在让我们看看
操作的重载实现。扩展方法通过将提供的
Action
作为
OnNext
语义传递,实际为您生成
IObserver


如果您希望处理
OnError
OnCompleted
通知,可以为所有接口方法实现提供
Action

要清楚,这不是过载,这是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));
}
公共静态IDisposable订阅(此IObservable源,操作onNext)
{
返回Subscribe(onNext,e=>{/*onError*/},()=>{/*onCompleted*/);
}
公共静态IDisposable订阅(此IObservable源、Action onNext、Action onError、Action onCompleted)
{
订阅(新的匿名观察者(onNext、onError、onCompleted));
}