CompositeDisposable クラスの Dispose メソッドを呼び出した後に Add したときの振る舞い
- CompositeDisposable クラスの Dispose メソッドを呼び出すと、CompositeDisposable に格納されている全ての要素に対して Dispose メソッドが呼ばれます。
- CompositeDisposable クラスの Dispose メソッドを呼び出すと、IsDisposed プロパティは true となり、Dispose 済みとなります。
- それ以降は Add メソッドで要素を追加すると、Add した直後にその要素の Dispose メソッドが呼ばれます。
CompositeDisposable を使い回そうとしてはまりました。
using System; using System.Reactive.Disposables; class Foo : IDisposable { public int Id { get; private set; } public Foo(int id) { Id = id; } public void Dispose() { Console.WriteLine($"id:{Id} dispose"); } } class Program { static void Main(string[] args) { var d = new CompositeDisposable(); d.Add(new Foo(1)); d.Add(new Foo(2)); Console.WriteLine("IsDisposed: {0}", d.IsDisposed); // false Console.WriteLine("-- call dispose --"); d.Dispose(); Console.WriteLine("IsDisposed: {0}", d.IsDisposed); // true Console.WriteLine("-- Add --"); d.Add(new Foo(3)); // ただちに Foo.Dispose が呼ばれる Console.WriteLine("-- call dispose --"); d.Dispose(); } }
コンパイル、実行結果です。
% mcs composite-disposable.cs -r:System.Reactive.Core.dll,System.Reactive.Interfaces.dll -out:a.exe % mono a.exe IsDisposed: False -- call dispose -- id:1 dispose id:2 dispose IsDisposed: True -- Add -- id:3 dispose -- call dispose --