如果我在枚举不可变哈希集时覆盖它,会发生什么
本文关键字:什么 覆盖 枚举 不可变 哈希集 如果 | 更新日期: 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
变量的值根本不会影响其他行为——它只会在下一次时影响它。(假设相关的内存屏障已经到位等)