如果我在枚举不可变哈希集时覆盖它,会发生什么

本文关键字:什么 覆盖 枚举 不可变 哈希集 如果 | 更新日期: 2023-09-27 18:24:07

我试图在这里揭穿不可变的集合。我的攻击点是经典的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循环会正常工作吗?还是会完全崩溃?(如果是的话,我们该怎么办呢?)谢谢。

如果我在枚举不可变哈希集时覆盖它,会发生什么

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

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

因此,基本上,在调用GetEnumerator()之后更改subscriptions变量的值根本不会影响其他行为——它只会在下一次时影响它。(假设相关的内存屏障已经到位等)