2016-06-14 5 views

Antwort

1

Ich habe das selbst betrachtet. Die Schlussfolgerung, zu der ich kam, ist, dass Frameworks, von denen Sie abhängig sind, dies verwenden würden (oder Sie würden dies verwenden, wenn Sie ein Framework erstellen). Ich sehe es als das Äquivalent eines leeren IEnumerable. Betrachten Sie den Fall, in dem Sie eine Methode aufrufen, die eine IEnumerable zurückgibt. Vielleicht hängt die IEnumerable, die von der Methode zurückgegeben wird, von den Parametern ab, die an die Methode übergeben werden; In einigen Fällen können keine Daten zurückgegeben werden. Einige ... Leute (ich habe mit einigen wenigen Worten hier gekämpft) könnten null zurückgeben, aber ein erleuchteter Entwickler würde eine leere IEnumerable zurückgeben. Ich sehe ein Observable, das niemals etwas ergibt, das einem leeren IEnumerable entspricht. Natürlich könnten Sie das Argument, dass Observable.Empty (die eine Observable, die sofort beendet) zurückgibt, ist wirklich das Äquivalent einer leeren IEnumerable, aber ich denke, es hängt wahrscheinlich von der Situation ab. Wer das Framework gestaltet, müsste entscheiden, welches semantisch korrekt ist, Observable.Empty oder Observable.Never.

Das sind meine zwei Cent. Vielleicht hat jemand einen besseren Grund.

+0

Schönes Denken. Eine Verwendung, die ich gesehen habe, ist auf dieser Seite (http://rxwiki.wikidot.com/101samples#toc39), wo es wie ein "Missing" -Argument verwendet wird, das Sie verwendet haben, um an COM-Server zu übergeben, wenn Sie OLE-Automatisierung wie von machen VBA. Mit anderen Worten, wenn jemand möchte, dass du ein "IObservable " passierst und du sagst: "Es ist mir egal, ich gebe dir keins, weil ich keins habe und es mir wirklich egal ist, ob oder nicht, du bekommst einen an diesem Ort. " Dies korreliert etwas mit Ihrem Kommentar, und es zieht auch eine feine Linie zwischen "Nie" und "Leer". –

2

Ich habe es mit Observable.Window und Observable.Buffer für die abschließende beobachtbare verwendet. Dies ist ein triviales Beispiel, da der echte Code zu komplex ist, um ihn zu posten.

static IObservable<Unit> CloseWindow(int interval) 
{ 
    if (interval <= 0) 
    { 
     return Observable.Never<Unit>(); 
    } 

    return Observable.Interval(TimeSpan.FromSeconds(interval)).Select(_ => Unit.Default); 
} 

Verwenden Sie beim Gruppieren von Daten für Analysten und manchmal erfordert es alle Daten und manchmal nicht. Wieder triviales Beispiel

static IObservable<double> AverageOfWindow(IObservable<int> source, int interval) 
{ 
    return source.Buffer(CloseWindow(interval)).Select(o => o.Average()); 
} 

Wenn Leere verwenden würde es nie zu einem Ergebnis führen und durch die Verwendung Nie ist es im Grunde durch die Buffer und Fenster Methoden übergeben. Könnte das Observable schreiben, um den Puffer zu überspringen, wenn es nicht benötigt wird, aber einfacher und weniger zu wartenden Code, wenn das CloseWindow über die gesamte Logik verfügt, um festzustellen, wann die Puffersequenz geschlossen wird. Auch in diesem Beispiel ist es trivial, aber in echtem Code ist die Logik zu entscheiden, wann der Puffer schließt, komplexer.

+0

Vielen Dank. Dies sind die Überladungen von 'Buffer', die ich nicht verstehe. Ich konnte nirgendwo eine Erklärung für sie finden. Könnten Sie das bitte erklären? Ich habe hier eine separate Frage für sie gestellt: http://stackoverflow.com/q/37824033/303685 –

5

Es ist ein grundlegendes "Atom" in der Zusammensetzung der beobachtbaren Ereignisströme und kommt in einer Vielzahl von Situationen - aber eine der häufigsten Anwendungen für Observable.Never in der Praxis ist in schriftlichen Tests. Es ermöglicht beispielsweise eine robuste Überprüfung der Timeout-Logik - und wird oft mit den TestScheduler oder anderen virtuellen Zeitsteuerungen in Testszenarien kombiniert. Wenn Sie den Quellcode von Rx selbst untersuchen, finden Sie ihn in vielen Komponententests.