gpt4 book ai didi

c# - 事件处理程序和 C# 类析构函数/处置

转载 作者:IT王子 更新时间:2023-10-29 04:24:39 25 4
gpt4 key购买 nike

我对 C# 类及其解构函数有点困惑。

我必须在构造函数中获取的类实例中使用一些事件处理程序:

 public Foo(IFooHandler handler)
{
handler.Load += Load;
handler.Close += Close;
}

当 Foo 类被销毁时,我需要取消订阅该事件。我是在其中实现 IDisposable 并取消订阅,还是在析构函数中实现?我需要消耗这些事件,我不能用其他方式来完成。

对于其中一个类,我创建了一个实例,检查进度,然后该类实例超出了范围。另一方面,它停留在 MainForm 中,直到表单关闭。第一个是我担心的,因为它可能仍然有对该事件处理程序的引用,但没有正确执行。

我不想泄漏内存。我应该何时以及如何退订?

最佳答案

不要在析构函数中这样做,因为在附加事件处理程序时不会调用它:当您附加 Foo 的实例方法作为 Bar 事件的处理程序时,Bar 将持有对 Foo 的引用, 所以 Foo 不会被垃圾回收,它的析构函数也不会被调用。

您应该实现 IDisposable,并显式处置您的对象

public void Dispose()
{
if (handler != null)
{
handler.Load -= Load;
handler.Close -= Close;
}
}

关于c# - 事件处理程序和 C# 类析构函数/处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1287794/

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