我正试图在这里揭穿不可变的集合。我的攻击点是经典的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
循环是否正常工作,还是完全被破坏? (如果是这样,可以做些什么来解决这个问题?)谢谢。
答案 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>时间。 (假设有相关的记忆障碍,等等。)