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

Dmi*_*ruk 0 .net c# collections immutability

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

然后订阅操作就可以了

var s = new Subscription(this, subscriber);
subscriptions = subscriptions.Add(s);
Run Code Online (Sandbox Code Playgroud)

并且发布操作会做类似的事情

foreach (var s in subscriptions)
  s.Subscriber.OnNext(args);
Run Code Online (Sandbox Code Playgroud)

但是,让我们假设在发布操作发生时,有人订阅,变量subscriptions被替换.将foreach循环正常运行,或将它被彻底打破?(如果是这样,可以做些什么来解决这个问题?)谢谢.

Jon*_*eet 6

subscriptions变量仅在循环开始时读取.请记住,foreach将代码翻译成以下内容:

using (var iterator = subscriptions.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        var s = iterator.Current;
        s.Subscriber.OnNext(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以基本上,subscriptions在你调用之后改变变量的值GetEnumerator()根本不会影响其余的行为 - 它只会在下次影响它.(假设有相关的记忆障碍,等等)