C# GC将使用函数指针收集对象吗?

C# GC将使用函数指针收集对象吗?,c#,events,garbage-collection,C#,Events,Garbage Collection,只是一个简单的问题。首先,让我验证我是否具有函数指针的正确含义。对于C#,函数指针基本上只是一个事件函数,对吗 第二,考虑下面的片段: public FormAnimator(Form form) { this.m_Form = form; this.m_Form.Load += new EventHandler(m_Form_Load); this.m_Form.VisibleChanged += new EventHandler(m_Form_Vis

只是一个简单的问题。首先,让我验证我是否具有函数指针的正确含义。对于C#,函数指针基本上只是一个事件函数,对吗

第二,考虑下面的片段:

public FormAnimator(Form form) 
{ 
    this.m_Form = form;       
    this.m_Form.Load += new EventHandler(m_Form_Load);
    this.m_Form.VisibleChanged += new EventHandler(m_Form_VisibleChanged);
    this.m_Form.Closing += new CancelEventHandler(m_Form_Closing);  
}
其中m_Form是类型为的私有变量

   //The form to be animated. 
    private Form m_Form;  
下面是类的实例化方式:

public partial class toastform : Form
{   
    public toastform(skImage ic) : this() {

        //Attach this form to the Formanimator. 
        //The FormAnimator now has a reference to this toastform.
        //When the load() of this form is invoked, the Form animator intercepts it and displays the form.
        this.m_Animator = new FormAnimator(this, FormAnimator.AnimationMethod.Slide, FormAnimator.AnimationDirection.Up, 400);

        }
所以,当我创建一个新的toastform(使用something=newtoastform();)并调用Show()时,Show方法应该是来自表单animator的方法。现在,当toastform关闭时,如何确保FormAnimator对象也被销毁。。如果有人能解释正在发生的一切,我将不胜感激。我的意思是。。toastform类和formanimator类都指向同一个对象吗?当我说formanimator“截取”taostform的事件时,这是我的行话吗

谢谢


tldr:我只需要知道是否需要手动删除Formanimator类中事件的处理程序。

您需要。垃圾收集在某些不可预测的时间运行。未被引用的对象将被垃圾收集,但您永远不知道何时需要。垃圾收集在某些不可预测的时间运行。未引用的对象将被垃圾收集,但您永远不知道何时进行。

Dispose
函数中,您应该分离函数引用

protected override Dispose(bool disposing)
{
    ....

     this.m_Form.Load -= new EventHandler(m_Form_Load);
     this.m_Form.VisibleChanged -= new EventHandler(m_Form_VisibleChanged);
     this.m_Form.Closing -= new CancelEventHandler(m_Form_Closing);  
}
或者,您可以使用弱引用

protected override Dispose(bool disposing)
{
    ....

     this.m_Form.Load -= new EventHandler(m_Form_Load);
     this.m_Form.VisibleChanged -= new EventHandler(m_Form_VisibleChanged);
     this.m_Form.Closing -= new CancelEventHandler(m_Form_Closing);  
}
这是一篇关于弱引用的非常非常好的文章:


Dispose
函数中,应该分离函数引用

protected override Dispose(bool disposing)
{
    ....

     this.m_Form.Load -= new EventHandler(m_Form_Load);
     this.m_Form.VisibleChanged -= new EventHandler(m_Form_VisibleChanged);
     this.m_Form.Closing -= new CancelEventHandler(m_Form_Closing);  
}
或者,您可以使用弱引用

protected override Dispose(bool disposing)
{
    ....

     this.m_Form.Load -= new EventHandler(m_Form_Load);
     this.m_Form.VisibleChanged -= new EventHandler(m_Form_VisibleChanged);
     this.m_Form.Closing -= new CancelEventHandler(m_Form_Closing);  
}
这是一篇关于弱引用的非常非常好的文章:


+1周参考。保存了我现在键入的答案:-)。对不起,此dispose应该放在FormAnimator类或实际表单中?如果它在FormAnimator类中,是否有必要“dispose”或我可以将其放在FormAnimator的析构函数中?您的
toastform
应该处置
此.m_Animator
,而且你的
FormAnimator
应该有我发布的代码。每周参考+1。保存了我现在键入的答案:-)。对不起,此dispose应该放在FormAnimator类或实际表单中?如果它在FormAnimator类中,是否有必要“dispose”或我可以将其放在FormAnimator的析构函数中?您的
toastform
应该处置
此.m_Animator
,而且你的
FormAnimator
应该有我发布的代码。