Будет ли GC собирать объект с указателями на функции? - PullRequest
1 голос
/ 25 февраля 2010

просто быстрый вопрос. Прежде всего, позвольте мне убедиться, что у меня есть правильное значение указателя на функцию. В случае 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 (с помощью что-то = new toastform ();) и вызываю Show (), метод show ДОЛЖЕН быть тем, из аниматора формы. Теперь, когда toastform закрывается, как мне убедиться, что объект FormAnimator также уничтожен ... Если кто-то может объяснить всю историю происходящего, я был бы признателен. я имею в виду, что ... класс toastform и класс formanimator оба указывают на один и тот же объект, это мой правильный язык, когда я говорю, что form animator "перехватывает" события taostform и т. д.

спасибо

tldr: мне просто нужно знать, нужно ли мне вручную удалять обработчики для событий в классе Formanimator.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

В вашей функции 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

1 голос
/ 25 февраля 2010

Тебе нужно. Сборка мусора запускается в непредсказуемое время. Объект, на который нет ссылки, будет собираться мусором, но вы никогда не знаете, когда.

...