.Subscribe
式を書いているときに、Resharperがmscorlib、Version = 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にあるのですか?
明確にするために、それは過負荷ではありません、それは本当にRxのコアです。Subscribe
あなたが慣れている他のすべてのメソッド、そしてそのことに関する他のすべての演算子は、実際にはそれを最終的に呼び出す拡張メソッドです。
初期のドキュメントまたはRxを見ると、作成者がそれをLINQのプッシュベースの側面と見なしていることがわかります。つまり、多くのものは、LINQに表示されるものの鏡像です。IObservable
鏡であるIEnumerable
、とIObserver
の鏡ですIEnumerator
。
ただし、プッシュはプルの反対であるため、Rxバージョンはプルベースのバージョンの反対です。
IEnumerable
を生成する1つのメソッドを定義しますIEnumerator
。IObservable
一つの方法定義を取り込みますIObserver
。IEnumerator.MoveNext()
+IEnumerator.Current
を1つの操作と考えると、次の要素が返される、コレクションの終わりに達する、または例外がスローされるという3つの方法のいずれかで戻ることができます。同様に、IObserver
は、次の要素(OnNext
)、ストリームの終わり(OnCompleted
)、または例外(OnError
)の3つのケースを処理する必要があります。よりよく知られている「オーバーロード」は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));
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加