gpt4 book ai didi

.net - 有了这个 .NET 事件,传入这个 IList 实例可以吗?

转载 作者:行者123 更新时间:2023-12-04 22:51:51 26 4
gpt4 key购买 nike

我有以下代码:-

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);

所以,我为一些 while/循环条件获取了所有的 foo。每 100 个 foo's i 然后触发一个事件,该事件将 foo's 列表传递给订阅者。然后我清除这个 foos 列表。一旦循环完成,我就会向订阅者发送任何剩余的 foo。

所以 - 如果我触发一个事件,其中包含 foo 的列表......然后我清除该列表......这是否意味着订阅者可能会获得该列表,该列表现在是空的?我应该通过列表的副本......然后清除原始列表吗?

最佳答案

忘记清除,您正在改变列表这一事实将对订阅您的事件的对象造成严重破坏。如果他们保留返回的列表,那么您将在添加到列表或清除列表的任何时候更改数据。

您不仅会弄乱订阅者,他们还会弄乱您,因为他们会改变列表并影响您自己的流程。

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

关于.net - 有了这个 .NET 事件,传入这个 IList 实例可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3774514/

26 4 0