要查看的四个接口如下所示。
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<T>
和IObservable<T>
接口偶。 IEnumerator<T>
和IObserver<T>
也是如此。 交互式接口,IEnumerable<T>
和IEnumerator<T>
,使用拉语义来描述一个序列的T
s。 反应性接口IObservable<T>
和IObserver<T>
,使用推语义来描述T
的序列。
假设我有一个名为e
的IEnumerator<T>
。当我打电话e.MoveNext()
随后e.Current
在成功的情况下,我在概念上获得的三两件事之一:
e.MoveNext()
回报true
,我得到了T
e.MoveNext()
抛出Exception
e.MoveNext()
回报false
和我已完成
请注意这些如何完全对应于IObserver<T>
方法OnNext
,OnError
,OnCompleted
。所不同的是在IEnumerator<T>
的情况下我拉出信息但在IObserver<T>
的情况下我推的信息。
当我呼叫IEnumerator<T>.Dispose
时,T
的顺序被取消。同样,当我在IObservable<T>.Subscribe
返回的IDisposable
上调用Dispose
时,T
的顺序被取消。
当我拨打电话IEnumerable<T>.GetEnumerator
我拉了一个IEnumerator<T>
。当我拨打IObservable<T>.Subscribe
我推在IObserver<T>
。