CompositeDisposable - 确定性订单?

时间:2014-07-15 18:22:00

标签: c# .net system.reactive

此问题引用System.Reactive.Disposables命名空间中的CompositeDisposable类。

CompositeDisposable对其成员调用Dispose的顺序是否确定?

以下实验产生了列表['a', 'b'],但我在文档中没有看到任何保证某个订单的内容。

var result = new List<char>();
var disposable = new CompositeDisposable(
    Disposable.Create(() => result.Add('a')),
    Disposable.Create(() => result.Add('b')));
disposable.Dispose();

3 个答案:

答案 0 :(得分:4)

内部CompositeDisposable使用以下字段存储一次性用品:

private List<IDisposable> disposables;

它使用列表.Add(...)方法将项​​添加到列表的末尾。通过构造函数添加项目时,列表将按顺序使用一次性实例化。

然后在处置时使用简单的foreach循环覆盖一次性物品。

因此,您可以确信当前的实施将按顺序处理它们。你也可以聪明地猜测,即使他们将来改变了实现,他们也不会改变这种行为,否则这将是一次重大改变。

答案 1 :(得分:2)

AFAIK订单未记录。窥视实现显示它按照添加的顺序处理它们。但由于没有记录,我猜你不能依赖它。

答案 2 :(得分:0)

您可以使用CompositeDisposable.cs代码并使用反向处理顺序生成ReversedCompositeDisposable。

自:

foreach (var d in currentDisposables)
    if (d != null)
        d.Dispose();

要:

for (var i = currentDisposables.Length; i > 0; i--)
    if (currentDisposables[i - 1] != null)
        currentDisposables[i - 1].Dispose();