Pur*_*ome 4 .net collections events list
我有以下代码: -
while (....)
{
var foo = DoTheFooShakeShakeShake(..);
foos.Add(foo); // foos is an IList<Foo>, btw and is new'd, above.
if (foos.Count % 100 == 0)
{
var e = new CustomFooEventArgs { UserId = whatever, Foos = foos };
OnFooPewPew(this, e);
foos.Clear();
}
}
// We still might have some foo's left over.. so send em off also.
// Excuse the woeful var names, below.
var e2 = new CustomFooEventArgs { UserId = whatever, Foos = foos };
OnFooPewPew(this, e2);
Run Code Online (Sandbox Code Playgroud)
所以,我抓住所有foo的一些while/loop条件.然后每100个foo我发起一个事件,将foo的列表传递给订阅者.然后我清除这个foos列表.一旦完成循环,我就会将剩余的foo发送给订户.
所以 - 如果我发起一个事件,其中包含foo的列表......然后我清除那个列表..这是否意味着订阅者可能获得该列表,现在是空的?我是否应该通过列表的COPY ...然后清除原始列表?
忘记清理,你正在改变列表的事实会对订阅你的事件的对象造成严重破坏.如果它们保留了返回的列表,那么您将在添加到列表或清除它时随时更改数据.
您不仅可以弄乱订阅者,他们还可以惹你麻烦,因为他们可能会改变列表并影响您自己的流程.
如果这不是理想的行为(我不能认为是这样),你甚至不想发送副本,而是发送IEnumerable<Foo>或者ReadOnlyCollection<Foo>.因为即使您发送了一份副本,如果您有多个订阅者,他们都会收到相同的副本,因此他们的突变仍会对彼此造成严重破坏.