相关疑难解决方法(0)

如何在不使用Subject <T>支持字段的情况下公开IObservable <T>属性

这个关于关于Subject<T>Enigmativity 的问题的答案中提到:

另外,你应该尽量避免使用主题.一般规则是,如果你正在使用一个主题,那么你做错了什么.

我经常使用主题作为IObservable属性的支持字段,这可能是在Rx之前的几天中的.NET事件.例如,而不是像

public class Thing
{
    public event EventHandler SomethingHappened;

    private void DoSomething()
    {
        Blah();
        SomethingHappened(this, EventArgs.Empty);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可能会这样做

public class Thing
{
    private readonly Subject<Unit> somethingHappened = new Subject<Unit>();
    public IObservable<Unit> SomethingHappened
    {
        get { return somethingHappened; }
    }

    private void DoSomething()
    {
        Blah();
        somethingHappened.OnNext(Unit.Default);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,如果我想避免使用Subject什么是正确的方式来做这种事情?或者我应该坚持在我的界面中使用.NET事件,即使它们被Rx代码使用(很可能FromEventPattern)?

此外,更多详细信息,为什么使用Subject这样一个坏主意将是有帮助的.

更新:为了使这个问题更加具体,我正在讨论使用Subject<T>从非Rx代码(可能是你正在使用其他一些遗留代码)到Rx世界的方法.所以,像:

class MyVolumeCallback : LegacyApiForSomeHardware
{
    private readonly Subject<int> volumeChanged …
Run Code Online (Sandbox Code Playgroud)

c# system.reactive

26
推荐指数
2
解决办法
3562
查看次数

标签 统计

c# ×1

system.reactive ×1