有了这个.NET事件,传入这个IList实例是否可以?

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 ...然后清除原始列表?

Ant*_*ram 5

忘记清理,你正在改变列表的事实会对订阅你的事件的对象造成严重破坏.如果它们保留了返回的列表,那么您将在添加到列表清除它时随时更改数据.

您不仅可以弄乱订阅者,他们还可以惹麻烦,因为他们可能会改变列表并影响您自己的流程.

如果这不是理想的行为(我不能认为是这样),你甚至不想发送副本,而是发送IEnumerable<Foo>或者ReadOnlyCollection<Foo>.因为即使您发送了一份副本,如果您有多个订阅者,他们都会收到相同的副本,因此他们的突变仍会对彼此造成严重破坏.