要查看的四個接口如下所示。
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>
。