c# - GC会收集一个带有函数指针的对象吗?

标签 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_VisibleChanged);
    this.m_Form.Closing += new CancelEventHandler(m_Form_Closing);  
}

其中 m_Form 是类型的私有(private)变量

   //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 = new toastform();)并调用 Show() 时,show 方法应该是来自表单动画师的方法。现在,当 toastform 关闭时,我如何确保 FormAnimator 对象也被销毁。如果有人可以解释正在发生的事情的全部故事,我将不胜感激。我的意思是.. toastform 类和 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);  
}

或者,您可以使用弱引用

这是一篇关于弱引用的非常、非常的好文章:

http://diditwith.net/PermaLink,guid,aacdb8ae-7baa-4423-a953-c18c1c7940ab.aspx

关于c# - GC会收集一个带有函数指针的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337173/

相关文章:

低 CPU 利用率的 Java 最佳编码实践

C# - 将公钥 blob 导入 ECDiffieHellmanCng

C# GUI 应用程序,另一个线程更新 UI 的另一个类

c# - 检测滚动事件(pdfnet)

vba - 在单元格单击时显示 MsgBox - 即使已选择单元格

linux - Solaris 平台上没有垃圾值,代码简单

c# - 将字符串截断为 X 个字符?

c# - TDD 中的命名测试与单元测试命名

javascript - 存储和恢复事件处理程序

java - 如果在 preparedstatement.execute() 期间互联网中断,则在 JDBC 上下载 blob 文件会导致内存泄漏