如果我在枚举它时覆盖一个ImmutableHashSet会发生什么?

时间:2013-07-20 20:08:49

标签: c# .net collections immutability

我正试图在这里揭穿不可变的集合。我的攻击点是经典的pub-sub事件代理,我们维护ImmutableHashSet<Subscription>个订阅。

然后订阅操作

var s = new Subscription(this, subscriber);
subscriptions = subscriptions.Add(s);

并且发布操作会执行类似

的操作
foreach (var s in subscriptions)
  s.Subscriber.OnNext(args);

但是,假设假设发布操作正在发生,有人订阅,变量subscriptions被替换。 foreach循环是否正常工作,还是完全被破坏? (如果是这样,可以做些什么来解决这个问题?)谢谢。

1 个答案:

答案 0 :(得分:6)

subscriptions变量仅在循环的 start 处读取。请记住,foreach正在将您的代码翻译成以下内容:

using (var iterator = subscriptions.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        var s = iterator.Current;
        s.Subscriber.OnNext(args);
    }
}

所以基本上,在调用subscriptions之后更改GetEnumerator()变量的值根本不会影响其余的行为 - 它只会影响 next < / em>时间。 (假设有相关的记忆障碍,等等。)