此问题引用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();
答案 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();