为什么表单事件不必注销?

问题描述 投票:0回答:1

默认形式的 Dispose 函数将如下所示:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}

正常的 Dispose Pattern 要求释放您的托管资源:

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Free other state (managed objects).
        }
        // Free your own state (unmanaged objects).
        // Set large fields to null.
        disposed = true;
    }
}

包括从事件中注销:

在 IDiposable 类的 Dispose 方法中取消注册外部事件是一个好习惯吗?

不注销事件处理程序是不是很糟糕?

我是否应该始终在 Dispose 方法中断开事件处理程序的连接?

据我了解,取消注册事件的目的是打破阻止垃圾收集器的循环引用:

Form holds a reference to the component, and the event subscription gives the component a reference to the form

但许多意见表明,如果您订阅的项目是“短暂的”或由表单拥有并与设计者一起构建,则不需要打破此循环。

components.Dispose()
base.Dispose(disposing)
是否以某种方式将我的本地
private System.Windows.Forms.Button button1
引用设置为空或取消注册我的事件处理程序
this.button1.Click += new System.EventHandler(this.button1_Click);
? 看起来组件从未初始化过,所以
components.Dispose()
甚至不会运行? 我们希望
button1
是短暂的并随表单一起消失,但是我们这里不是有一个引用循环来阻止垃圾收集器清理吗?

c# events user-controls garbage-collection dispose
1个回答
0
投票

感谢@glorin-oakenfoot,但他们从未发表评论作为答案。

C# 垃圾收集器不计算引用,它会查看该对象是否可以从根对象访问。 因此,如果较大的系统没有指向循环中任何项目的链接,则循环引用就不是内存泄漏。 它们都会同时被垃圾收集。

文章来自MSDN

© www.soinside.com 2019 - 2024. All rights reserved.