管理人の技術ブログです。Disposables名前空間まとめRxRx入門を書いてから早2年。考え方は変わらないものの、いくつかObsoleteになってしまった機能もあり、参考にして頂いている方には多少なり申し訳なさがあります...。搭載され、Rxの出番は書いた当初よりは少なくなったと思われますが、もともとの思想が違えば用途も違うということで棲み分けは十分に可能です。学習する価値はあります!最近でもSignalRをRxで楽しようとReactiveSignalRを作ったりしましたし、やっぱりRxは便利です。RxやSignalRは接続状態をIDisposableなオブジェクトに持たせ、Disposeメソッドで接続を解除するという動きをします。このIDisposableなオブジェクトをどう扱うかはアプリケーション仕様ですが、様々なバリエーションがあると思います。この扱いを少しでも楽にするため、System.Reactive.Disposables名前空間に補助機能が用意されています。今一度これらの挙動を確認してみました。前準備Dispose処理の挙動を調べるため、Disposeされたときにコンソール出力するだけの単純なクラスを用意しておきます。}}BooleanDisposableクラスBooleanDisposableは非常に単純で、DisposeしたらIsDisposedのフラグを立てるだけです。Disposeしたらフラグ立てるだけConsole.WriteLine(d.IsDisposed);/*FalseTrue*/CancellationDisposableクラスCancellationDisposableはCancellationTokenSourceをラップしただけのもので、Dispose時にCancelメソッドが呼び出されます。IsDisposedプロパティはIsCancellationRequestedを返します。CancellationDisposable(source);Console.WriteLine(d.IsDisposed);d.Dispose();Console.WriteLine(d.IsDisposed);/*FalseCancelledTrue*/CompositeDisposableクラスCompositeDisposableはIDisposableなオブジェクトをグループ化し、まとめてDisposeを呼び出します。追加はコンストラクタ、もしくはAddメソッドで行います。Clearメソッドは内部に格納しているIDisposableオブジェクトをDisposeしつつコレクションから削除します。DisposeメソッドもClearメソッドと同様の動きをしますが、こちらは1度しか呼び出せません。Disposeメソッドを呼び出すと、その後にAddメソッドで追加しようとしても即座にDisposeされます。Disposed*/ContextDisposableクラスContextDisposableは、コンストラクタで指定されたSynchronizationContext上で指定されたIDisposableオブジェクトのDisposeメソッドを呼び出します。SynchronizationContextには同期的にメッセージを送信するSendメソッドと非同期的に送信するPostメソッドがありますが、Dispose時に利用されるのはPostメソッドです。同期コンテキストの対象となるスレッドが暇になったときに実行される、ということだけ押さえておきましょう。Disposed*/ScheduledDisposableクラスScheduledDisposableは先のContextDisposableと似ていて、コンストラクタで与えられたIScheduler上で指定されたIDisposableオブジェクトのDisposeメソッドを呼び出します。Disposed*/SingleAssignmentDisposableクラスSingleAssignmentDisposableはDisposableプロパティにIDisposableオブジェクトを後付けで指定します。このset操作は一度しかできません。状態で別のインスタンスを設定しようとすると「すでに設定されてるよ」の旨の例外が発生します。SingleAssignmentDisposable自体がすでにDisposeされている状態でDisposableプロパティにインスタンスを設定しようとすると、即座にDisposeが呼び出されます。Disposed*/MultipleAssignmentDisposableクラスMultipleAssignmentDisposableもSingleAssignmentDisposableと同様、DisposableプロパティにIDisposableオブジェクトを後付けで指定します。SingleAssignmentDisposableと異なるところは、Disposableプロパティへのset操作を複数回行えることです。DisposableプロパティにすでにインスタンスAが設定されている状態で別のインスタンスBを設定すると、AのDisposeは呼び出されずBに差し替えられます。MultipleAssignmentDisposable自体がすでにDisposeされている状態での挙動は同様です。Disposed*/SerialDisposableクラスSerialDisposableもDisposableにプロパティにインスタンスを後付けで設定します。MultipleAssignmentDisposableは先に設定されていたインスタンスに手を加えることなくインスタンスの差し替えを行いますが、SerialDisposableは先に設定されていたインスタンスをDisposeしてから差し替えを行います。SerialDisposable自体がDisposeされている状態での挙動は同様です。Disposed*/RefCountDisposableクラスRefCountDisposableはコンストラクタで指定されたインスタンスを参照カウントで管理します。