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 --

リンク