Dar*_*key 3 c# system.reactive
我经常遇到这样的情况:我想要一个 UI 元素“观察”一个潜在的值——假设我正在显示一个 int——我想要一个我可以订阅的 IObservable。
我一直在下面使用一个主题,所以我可以设置它。这真的很好用……除了第一次。如果我设置了主题 - 然后稍后通过打开一个新的 UI 元素订阅它 - 它不会触发 onnext 直到下一次更改。
我基本上想要一些像主题一样工作的东西 - 但总是立即对任何新订阅者执行最新值的 onNext 。
我知道我可以自己编写这样的构造 - 但它似乎是一个常见的用例 - 是否有我遗漏的标准?
你想要BehaviorSubject<T>或ReplaySubject<T>。
BehaviorSubject<T> 重放最近的单个值并要求您在构造函数中提供初始值。
你像这样使用它:
var bs = new BehaviorSubject<int>(0);
bs.Subscribe(x => Console.WriteLine(x));
bs.OnNext(42);
bs.Subscribe(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)
这将输出0,然后42,然后42到控制台。
ReplaySubject<T>更一般一些。它允许您指定要重播的值的数量,但不强制您提供初始值。
var rs = new ReplaySubject<int>(1);
rs.Subscribe(x => Console.WriteLine(x));
rs.OnNext(42);
rs.Subscribe(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)
这会产生42,然后42到控制台。
将此与标准Subject<T>.
var s = new Subject<int>();
s.Subscribe(x => Console.WriteLine(x));
s.OnNext(42);
s.Subscribe(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)
那只是产生42.