这个问题引用了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();
CompositeDisposable
内部使用以下字段存储一次性物品:
private List<IDisposable> disposables;
它使用list .Add(...)
方法将项添加到列表的末尾。当通过构造函数添加项时,列表按顺序实例化为可处置项。
然后在处置时对可处置项使用一个简单的foreach
循环。
因此,您可以确信当前实现将按顺序处理它们。你也可以做一个聪明的猜测,他们不会改变这种行为,即使他们在未来改变了实现,否则这将是一个破坏性的改变。
恐怕订单没有记录。窥视一下实现就会发现,它按照添加的顺序对它们进行了处理。但由于没有文档记录,我想你不能依赖它
你可以取CompositeDisposable.cs的代码,并使ReversedCompositeDisposable具有相反的Dispose顺序。
来自: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();