gpt4 book ai didi

c# - 无线事件是内存泄漏吗?

转载 作者:太空狗 更新时间:2023-10-29 20:57:36 24 4
gpt4 key购买 nike

如果是,有没有办法为所有有线事件全局解除它

编辑:举个例子。我有一些对象,每个对象都标记有一个事件,例如 orm.NatureChanged += Nature_Changed; 我在创建每个 orm 实例时标记这些事件。如果我不通过 orm.NatureChanged -= Nature_Changed; 之类的方式拆线,会不会导致内存泄漏?

最佳答案

无论您问什么,您问题的技术答案都是“否”。从技术上讲,除非您发现 CLR 中的错​​误,否则托管对象不存在真正的“内存泄漏”(这是使它们成为好东西的重要原因)。不过,要回答我认为您实际上在问的问题,听起来您是在问以下两件事之一:

  1. 对于没有任何委托(delegate)的事件,是否需要做些什么?
  2. 事件能否阻止对象被垃圾收集器清理?

第一个问题的答案是“否”。往前走,这里没什么可看的。

第二个问题的答案已在 SO 和网络的其他区域进行了详细讨论。简短的版本是附加的事件处理程序意味着 GC 会将目标实例视为事件触发实例“可达”。这可能导致对象在内存中保留的时间比预期的要长,因为由于委托(delegate)的构造方式,这种可达性对用户(开发人员)来说是透明的。

换句话说,假设我有两个对象:生产者和消费者。生产者触发消费者...消费的事件。

public class Producer
{
public event EventHandler OmgIDidSomething;
}

public class Consumer
{
public void AttachTo(Producer producer)
{
producer.OmgIDidSomething += new EventHandler(producer_OmgIDidSomething);
}

private void producer_OmgIDidSomething(object sender, EventArgs e)
{
// ...
}
}

在这个例子中,任何调用了AttachToConsumer实例在GC之前都保持可达,直到Producer实例出现> 它附加到的对象符合收集条件,因为 OmgIDidSomething 事件实现背后的委托(delegate)引用了它对应的 Consumer 实例。

关于c# - 无线事件是内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com