言及されたエニグマティビティに関する質問へのこの回答Subject<T>
では:
余談ですが、件名を使用しないようにしてください。一般的なルールは、サブジェクトを使用している場合、何か間違ったことをしているということです。
私はよくサブジェクトをIObservable
プロパティのバッキング フィールドとして使用します。これは、Rx の前の時代にはおそらく .NET イベントだったでしょう。たとえば、次のようなものの代わりに
public class Thing
{
public event EventHandler SomethingHappened;
private void DoSomething()
{
Blah();
SomethingHappened(this, EventArgs.Empty);
}
}
私はするかもしれません
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);
}
}
それで、私がSubject
この種のことをする正しい方法は何でしょうか?それとも、Rx コードによって消費される場合でも、インターフェイスで .NET イベントを使用することに固執する必要がありますFromEventPattern
か (おそらく)。
Subject
また、このように使用することが悪い考えである理由についてもう少し詳しく説明すると役立ちます。
更新: この質問をもう少し具体的にSubject<T>
するために、Rx 以外のコード (おそらく他のレガシー コードを使用している) から Rx の世界に入る方法として を使用することについて話しています。したがって、次のようなものです:
class MyVolumeCallback : LegacyApiForSomeHardware
{
private readonly Subject<int> volumeChanged = new Subject<int>();
public IObservable<int> VolumeChanged
{
get
{
return volumeChanged.AsObservable();
}
}
protected override void UserChangedVolume(int newVolume)
{
volumeChanged.OnNext(newVolume);
}
}
イベントを使用する代わりに、LegacyApiForSomeHardware 型を使用すると、「これが起こった」という通知を取得する方法として仮想メソッドをオーバーライドできます。