首页 > 解决方案 > 使用析构函数分离事件

问题描述

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

所以有一个自定义的TextBox:

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

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

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

我应该删除析构函数吗?

标签: c#.netconstructordestructor

解决方案


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

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

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

您应该清理的事件是您正在处理的类注册到另一个对象上的事件,该对象将存在更长的时间。

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


推荐阅读