Is there a Subject implementation in Rx.NET that functionally resembles BehaviorSubject but emits only if the value has changed?(rx.net中是否有功能类似于BehaviorSubject的Subject实现,但仅在值发生更改时才发出?)
问题描述
rx.net中是否有Subject
实现在功能上类似于BehaviorSubject
,但仅在其发生更改时才发出下一个值?
我对反应式扩展相当陌生,似乎找不到任何类似的东西,尽管此模式感觉像是INotifyPropertyChanged
的自然替代品。
BehaviorSubject<T>
,如下所示。与使用Observable.DistinctUntilChanged
创建可组合的可观察对象相比,这样做有什么缺点吗?
public class DistinctSubject<T> : SubjectBase<T>
{
private readonly BehaviorSubject<T> _subject;
public DistinctSubject(T initialValue) =>
_subject = new BehaviorSubject<T>(initialValue);
public T Value
{
get => _subject.Value;
set => this.OnNext(value);
}
public override bool HasObservers => _subject.HasObservers;
public override bool IsDisposed => _subject.IsDisposed;
public override void Dispose() => _subject.Dispose();
public override void OnCompleted() => _subject.OnCompleted();
public override void OnError(Exception error) => _subject.OnError(error);
public override void OnNext(T value)
{
if (!EqualityComparer<T>.Default.Equals(value, _subject.Value))
{
_subject.OnNext(value);
}
}
public override IDisposable Subscribe(IObserver<T> observer) =>
_subject.Subscribe(observer);
}
推荐答案
浏览了一下BehaviorSubject<T>
类的source code之后,如果OnError
后跟OnNext
:
DistinctSubject<T>
实现的行为似乎会有所不同
var subject = new DistinctSubject<int>(2021);
subject.OnError(new ApplicationException());
subject.OnNext(2022); // throws ApplicationException
此操作将引发,而对BehaviorSubject<T>
执行相同操作将不会引发(仅忽略OnNext
)。
我的建议是在实现中使用DistinctUntilChanged
运算符,如下所示:
public class DistinctSubject<T> : ISubject<T>, IDisposable
{
private readonly BehaviorSubject<T> _subject;
private readonly IObservable<T> _distinctUntilChanged;
public DistinctSubject(T initialValue, IEqualityComparer<T> comparer = default)
{
_subject = new BehaviorSubject<T>(initialValue);
_distinctUntilChanged = _subject.DistinctUntilChanged(
comparer ?? EqualityComparer<T>.Default);
}
public T Value => _subject.Value;
public void OnNext(T value) => _subject.OnNext(value);
public void OnError(Exception error) => _subject.OnError(error);
public void OnCompleted() => _subject.OnCompleted();
public IDisposable Subscribe(IObserver<T> observer) =>
_distinctUntilChanged.Subscribe(observer);
public void Dispose() => _subject.Dispose();
}
如果您担心对象的不必要分配,那么您还不熟悉Rx的精神。此库关注的是功能和易用性,而不是performance或效率!
这篇关于rx.net中是否有功能类似于BehaviorSubject的Subject实现,但仅在值发生更改时才发出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:rx.net中是否有功能类似于BehaviorSubject的Subject实现,但仅在值发生更改时才发出?
基础教程推荐
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- rabbitmq 的 REST API 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- c# Math.Sqrt 实现 2022-01-01