2017-04-07 3 views
3

나는 종종 ReSharper에서이 버전 = 4.0.0.0을 mscorlib에에있는 나에게 다음과 같은 과부하를 선택한 것을 발견이 걸릴 대부분의 과부하는 매우 다른 것 같다IObservable.Subscribe (IObserver <T>) 과부하 란 무엇입니까? 내가 <code>.Subscribe</code> 표현을 쓰고 있어요 때

namespace System 
{ 
    public interface IObservable<out T> 
    { 
    IDisposable Subscribe(IObserver<T> observer); 
    } 
} 

Action 및 또한 그것은 mscorlib에서 오는 것이고 System.Reactive.*이 아닙니다. 나는 반응성 물질의 대부분을 기대합니다.

이 오버로드는 무엇을합니까? 어떻게 사용해야합니까? IObserver<T>은 (는) Action과 어떻게 관련이 있습니까? 왜이 단일 오버로드가 mscorlib에 있습니까?

답변

5

분명히 말하자면 과부하가 아니라 Rx의 핵심입니다. 다른 모든 Subscribe 메쏘드와 그 문제에 대한 다른 모든 연산자는 익숙하다는 것은 궁극적으로 이것을 호출하는 확장 메쏘드입니다.

초기 문서 또는 Rx를 보면 제작자가 LINQ의 푸시 기반 측면으로 보았다는 것을 알 수 있습니다. 그래서 많은 것들이 LINQ에서 볼 수있는 것의 거울 이미지입니다. IObservableIEnumerable의 미러이고 IObserverIEnumerator의 미러입니다.

그러나, 푸시 풀의 반대이므로 수신 버전들이 풀 - 기반의 대응 대향 때문 :

  • IEnumerableIEnumerator가 생성하는 한 가지 방법을 정의한다. IObservableIObserver 인 하나의 방법을 정의합니다.
  • 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)); 
} 
1

IObserver을 보면 그 이유를 알 수 있습니다. 인터페이스는 세 가지 방법 (또는 Action)을 포함하며, 가장 많이 사용되는 것은 OnNext입니다.

Actionhere에 대한 과부하 구현을 살펴 보겠습니다. 확장 메소드는 실제로 제공된 ActionOnNext의 의미로 전달하여 사용자에게 IObserver을 생성합니다.

OnErrorOnCompleted 알림을 처리하려는 경우 모든 인터페이스 메소드 구현에 대해 Action을 제공 할 수 있습니다.