默认形式的 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 方法中断开事件处理程序的连接?
据我了解,取消注册事件的目的是打破阻止垃圾收集器的循环引用:
但许多意见表明,如果您订阅的项目是“短暂的”或由表单拥有并与设计者一起构建,则不需要打破此循环。
components.Dispose()
或base.Dispose(disposing)
是否以某种方式将我的本地private System.Windows.Forms.Button button1
引用设置为空或取消注册我的事件处理程序this.button1.Click += new System.EventHandler(this.button1_Click);
? 看起来组件从未初始化过,所以components.Dispose()
甚至不会运行? 我们希望 button1
是短暂的并随表单一起消失,但是我们这里不是有一个引用循环来阻止垃圾收集器清理吗?
感谢@glorin-oakenfoot,但他们从未发表评论作为答案。
C# 垃圾收集器不计算引用,它会查看该对象是否可以从根对象访问。 因此,如果较大的系统没有指向循环中任何项目的链接,则循环引用就不是内存泄漏。 它们都会同时被垃圾收集。