【问题标题】:Using destructors to detach events使用析构函数分离事件
【发布时间】:2018-12-15 16:29:25
【问题描述】:

在项目中注意到了这段代码:

所以有一个自定义的TextBox:

public sealed class CoolTextBox : TextBox
{
    ...
    public CoolTextBox()
    {
        this.DefaultStyleKey = typeof(CoolTextBox);
        this.TextChanged += this.CoolTextBox_TextChanged;
    }

    ~CoolTextBox()
    {
        this.TextChanged -= this.CoolTextBox_TextChanged;
    }
    ...
}

我从来没有写过这种类型的结构。但据我所知,来自谷歌的信息表明你不应该相信析构函数,因为它们可以随时被调用。

我应该只删除析构函数吗?

【问题讨论】:

  • 只有在拥有已订阅事件的对象的生命周期比添加订阅的对象长时,您才需要取消订阅事件处理程序。在这种情况下,两者都是同一个对象,因此生命周期是相等的。无需退订。
  • 派生类可以覆盖OnTextChanged。您无需订阅该事件。
  • 检查 WeakReference 以了解此类情况
  • Finalizer - 会调用那个 evre 吗?因为我看到它的方式......事件将使对象保持活动状态,因此永远不会调用终结器。

标签: c# .net constructor destructor


【解决方案1】:

终结器只能用于清理非托管资源。它们可以按任何顺序调用,并且有最长的执行时间。

如果您有任何非托管资源,请使用Dispose pattern

如果您没有任何非托管资源,请实现IDisposable

您应该清理的事件是您正在处理的类注册到另一个对象上的事件,该对象的寿命会更长。

如果您可以完全避免使用events,那就更好了,因为忘记注销处理程序会阻止垃圾收集。

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2022-09-27
    • 2022-11-17
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多