C#
ReactiveExtensions

[C#][ReactiveExtensions] CompositeDisposableを再利用したい(DisposeではなくClearを使う)

TL;DR

タイトルでもうすでに完結してるんですが・・・、DisposeではなくClearを使えばよかったというメモ。

背景

CompositeDisposableは一度でもDispose呼んじゃうと、その後にAddしても追加したそばからDisposeが呼ばれて破棄されるようになってしまいます。というかそういう仕様です。

それを知らずに使ってて、ReactivePropertyのSubscribeが2回目以降に効かなくなって困るという状態でした。
なのでDispose後に再度CompositeDisposableをnewするというイマイチな実装にしてました・・・。

CompositeDisposable.Add Method (System.Reactive.Disposables)

Addは以下のような仕様です。CompositeDisposable自体がdisposeされると、その後のAddされたものは都度disposeされるようになるようです。

Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.

CompositeDisposable.Clear Method (System.Reactive.Disposables)

Clearなら登録されているものを全てdisposeしますが、CompositeDisposable自体はdisposeしません。なのでそのまま継続利用できます。

Removes and disposes all disposables from the GroupDisposable, but does not dispose the CompositeDisposable.

CompositeDisposable.Remove Method (System.Reactive.Disposables)

Removeも削除時に対象のdisposeを呼ぶ仕様なので、場合によってはRemoveを利用してもよいかと思います。

Removes and disposes the first occurrence of a disposable from the CompositeDisposable.

結論

再利用したい場合はDisposeではなく、Clear or Remove を使いましょう。
(サンプルコードがDipose呼んでるものばかりなので、CompositeDisposableは再利用できないものと勘違いしていました)

参考

CompositeDisposable Class (System.Reactive.Disposables)

この記事を書いてる途中まで、以下の記事(RxJava)のようにReusableCompositeDisposableを定義しないといけないのかなと思ってました・・・。
CompositeSubscriptionは再利用できない #RxJava - Islands in the byte stream