CompositDisposable还不够懒惰

本文关键字:不够 CompositDisposable | 更新日期: 2023-09-27 18:14:34

我很惊讶,响应式扩展CompositeDisposable类未能通过以下测试

[Test]
public void TestDisposable()
{
    var ds = new List<IDisposable>();
    int[] a = { 1, 2, 3 };
    using (new CompositeDisposable(ds))
    {
        ds.Add(Disposable.Create(() => a[0] = 3));
        ds.Add(Disposable.Create(() => a[2] = 1));
    }
    Assert.That(a[0],Is.EqualTo(3)); //Failed here
    Assert.That(a[1], Is.EqualTo(2));
    Assert.That(a[2], Is.EqualTo(1));
}

因此,这意味着如果我通过给定IEnumerable<IDisposable>创建CompositeDisposable,它实际上会迭代其所有元素,而不是将此延迟到调用Dispose

这在其他情况下可能有用,但在我的情况下不方便。有没有其他的类可以更容易地实现上述目标?

CompositDisposable还不够懒惰

CompositeDisposable的构造函数将复制您的列表。因此,当您随后向列表中添加元素时,它们将不会被CompositeDisposable .

使用。

这里有一个简单的解决方案:

using (var composite = new CompositeDisposable())
{
    composite.Add(Disposable.Create(() => a[0] = 3));
    composite.Add(Disposable.Create(() => a[2] = 1));
}

或者,如果不方便,这里有一个解决方法:

public static IDisposable AsLazyComposite(this IEnumerable<IDisposable> sequence)
{
    return Disposable.Create(() =>
    {
        foreach (var disposable in sequence)
            disposable.Dispose();
    });
}

用法:

using (ds.AsLazyComposite())