Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不';t形事件是否必须取消注册?_C#_Events_User Controls_Garbage Collection_Dispose - Fatal编程技术网

C# 为什么不';t形事件是否必须取消注册?

C# 为什么不';t形事件是否必须取消注册?,c#,events,user-controls,garbage-collection,dispose,C#,Events,User Controls,Garbage Collection,Dispose,默认的form Dispose函数如下所示: protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } 释放托管资源的正常调用: protected virtual void Dispose(bool dis

默认的form Dispose函数如下所示:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        components.Dispose();
    }
    base.Dispose(disposing);
}
释放托管资源的正常调用:

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;
    }
}
包括从事件注销:

据我所知,注销事件的目的是打破阻止垃圾收集器的循环引用:

但许多观点认为,如果您订阅的项目是“短期的”或由表单拥有并由设计师创建,则不需要打破这个循环


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

如果事件发布者比订阅服务器的寿命长,您只需要注销事件。这是因为发布者将通过事件处理程序保留对订阅服务器的引用,因此订阅服务器不符合GC的条件。对于单个表单上的事件(即每天按钮单击事件),当表单不再被引用时,订阅者和发布者都有资格同时获得GC。GC知道表单不再被引用,因此其中的所有内容都可以被收集,包括任何循环事件引用。“GC知道表单不再被引用”这是我正在努力解决的部分,因为表单不是在事件注册后被按钮引用的吗?引用计数不是0。GC不计数引用。它跟踪是否可以从程序的“实时”部分访问某些内容。请参阅答案以获得大致概述。啊。。。MS source on the roots:…@GlorinOakenfoot-评论不算在内,因此,您在这里有足够的答案。只有在事件发布者比订阅者长寿的情况下,您才需要注销事件。这是因为发布者将通过事件处理程序保留对订阅服务器的引用,因此订阅服务器不符合GC的条件。对于单个表单上的事件(即每天按钮单击事件),当表单不再被引用时,订阅者和发布者都有资格同时获得GC。GC知道表单不再被引用,因此其中的所有内容都可以被收集,包括任何循环事件引用。“GC知道表单不再被引用”这是我正在努力解决的部分,因为表单不是在事件注册后被按钮引用的吗?引用计数不是0。GC不计数引用。它跟踪是否可以从程序的“实时”部分访问某些内容。请参阅答案以获得大致概述。啊。。。MS source on the roots:…@GlorinOakenfoot-评论并不重要,所以,你这里有足够的答案。