Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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
C# .Net观察者模式更改。这是什么时候发生的,为什么?_C#_.net_Observer Pattern - Fatal编程技术网

C# .Net观察者模式更改。这是什么时候发生的,为什么?

C# .Net观察者模式更改。这是什么时候发生的,为什么?,c#,.net,observer-pattern,C#,.net,Observer Pattern,我只是想向同事解释观察者模式,以便在C应用程序中使用。我注意到,通过查找一些MSDN文档,is应该很容易实现。然而,我惊讶地发现MSDN示例偏离了我所学的观察者模式。请注意,我主要使用Java中的模式,但我的印象是.Net实现基本相同 我知道的模式使用Notify、Subscribe和Unsubscribe方法。MSDN上解释的这个新实现使用OnNext、OnCompleted、OnError和Subscribe。然而,我能找到几年前的文章来解释它的Notify版本 乍一看,这个新版本似乎不必要

我只是想向同事解释观察者模式,以便在C应用程序中使用。我注意到,通过查找一些MSDN文档,is应该很容易实现。然而,我惊讶地发现MSDN示例偏离了我所学的观察者模式。请注意,我主要使用Java中的模式,但我的印象是.Net实现基本相同

我知道的模式使用Notify、Subscribe和Unsubscribe方法。MSDN上解释的这个新实现使用OnNext、OnCompleted、OnError和Subscribe。然而,我能找到几年前的文章来解释它的Notify版本


乍一看,这个新版本似乎不必要的复杂,它让我有点困惑。这种实现从什么时候开始,为什么以这种方式实现?优点是什么?

请记住,.NET Observer接口与MS密切相关。如果您想了解OneError/OnCompleted提供的新增功能,这里可能是研究的最佳场所。该模式的其余部分基本上与以下内容相匹配:

订阅仍然只是订阅。 Unsubscribe旨在通过处理Subscribe返回的上下文来实现。 OnNext对应于Notify。
因此,唯一的新功能是OneError提供了一个并行错误报告通道,让观察者知道被观察者已经进入错误状态,并且未完成,让观察者知道被观察者将不再提供任何消息。您可以在消息中详细说明这些状态转换,但是,如果您将可观察对象视为一种消息通道,它可以经历与消息本身的意图有点正交的状态变化,那么将其烘焙是有意义的。

请记住,.NET Observer接口与MS密切相关。如果您想了解OneError/OnCompleted提供的新增功能,这里可能是研究的最佳场所。该模式的其余部分基本上与以下内容相匹配:

订阅仍然只是订阅。 Unsubscribe旨在通过处理Subscribe返回的上下文来实现。 OnNext对应于Notify。
因此,唯一的新功能是OneError提供了一个并行错误报告通道,让观察者知道被观察者已经进入错误状态,并且未完成,让观察者知道被观察者将不再提供任何消息。您可以在消息中详细说明这些状态转换,但是,如果你把一个可观察的对象看作一种消息通道,它可以经历与消息本身的意图有点正交的状态变化,那么将它们烘焙是有意义的

IEnumerable<T>
    IEnumerator<T> GetEnumerator()

IEnumerator<T>
    bool MoveNext()
    T Current { get; }
    void Dispose()

IObservable<T>
    IDisposable Subscribe(IObserver<T>)

IObserver<T>
    void OnNext(T)
    void OnError(Exception)
    void OnCompleted()
IEnumerable和IObservable接口是对偶的。IEnumerator和IObserver也是如此。交互式接口IEnumerable和IEnumerator使用pull语义来描述Ts序列。反应式接口IObservable和IObserver使用push语义来描述Ts序列

假设我有一个名为e的IEnumerator。当我在成功的情况下调用e.MoveNext,然后调用e.Current时,从概念上讲,我得到了三件事之一:

e、 MoveNext返回true,我得到一个T e、 MoveNext抛出一个异常 e、 MoveNext返回false,我已完成 请注意,这些方法与IObserver方法OnNext、OnError和OnCompleted完全对应。不同之处在于IEnumerator案例中我提取信息,而IObserver案例中我推送信息

当我调用IEnumerator.Dispose时,Ts序列被取消。类似地,当我调用IObservable.Subscribe返回的IDisposable时,Ts序列被取消


当我调用IEnumerable.GetEnumerator时,我会拉出一个IEnumerator。当我调用IObservable.Subscribe时,我会推送一个IObserver。

要查看的四个接口如下

IEnumerable<T>
    IEnumerator<T> GetEnumerator()

IEnumerator<T>
    bool MoveNext()
    T Current { get; }
    void Dispose()

IObservable<T>
    IDisposable Subscribe(IObserver<T>)

IObserver<T>
    void OnNext(T)
    void OnError(Exception)
    void OnCompleted()
IEnumerable和IObservable接口是对偶的。IEnumerator和IObserver也是如此。交互式接口IEnumerable和IEnumerator使用pull语义来描述Ts序列。反应式接口IObservable和IObserver使用push语义来描述Ts序列

假设我有一个名为e的IEnumerator。当我在成功的情况下调用e.MoveNext,然后调用e.Current时,从概念上讲,我得到了三件事之一:

e、 MoveNext返回true,我得到一个T e、 MoveNext抛出一个异常 e、 MoveNext返回false,我已完成 请注意,这些方法与IObserver方法OnNext、OnError和OnCompleted完全对应。不同之处在于IEnumerator案例中我提取信息,而IObserver案例中我推送信息

当我调用IEnumerator.Dispose时,Ts序列被取消。类似地,当我调用IObservable.Subscribe返回的IDisposable时,Ts序列被取消

当我调用IEnumerable.GetEnumerator时,我会拉出一个IEnumerator。当我调用IObservable.Subscribe时,我推送一个IObserver