2010-02-25 4 views
1

그냥 빠른 질문입니다. 우선, 함수 포인터의 의미가 올바른지 확인하도록하겠습니다. C#의 경우, 함수 포인터는 기본적으로 그냥 이벤트 함수입니다. 맞습니까?GC가 함수 포인터를 사용하여 객체를 수집합니까?

초, 다음 코드를 고려하십시오 m_Form 클래스가 인스턴스화

//The form to be animated. 
    private Form m_Form; 

Heres는 어떻게 유형의 개인 변수

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); 
} 

: 그래서

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()를 호출하십시오 메서드는 양식 애니메이터의 메서드 여야합니다 (SHOULD). 이제, 토스트 폼이 닫힐 때 FormAnimator 객체가 어떻게 파괴되는지 확인하려면 어떻게해야합니까? 만약 누군가가 무슨 일이 일어나고 있는지 전체 이야기를 설명해 주시면 감사하겠습니다. 내 말은 ..

감사

toastform 클래스를 어떻게 ... 그, 그리고 내가 등등 형태 애니메이터 "차단"는 taostform의 이벤트를 말할 때 formanimator 클래스 같은 객체에 둘 점은, 내 용어의 권리

tldr : Formanimator 클래스의 이벤트 핸들러를 수동으로 제거해야하는지 알고 싶습니다.

답변

3

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

+0

1 주 참조에 대한 다음은

은 약한 참조에 매우 매우 좋은 기사입니다. 지금 내 대답을 타이핑 해 뒀어 .--). –

+0

죄송합니다.이 처분은 FormAnimator 클래스 또는 실제 양식에 있어야합니까? – masfenix

+0

formanimator 클래스에있는 경우 "처분"해야하거나 Formanimator의 소멸자에 넣을 수 있습니까? – masfenix

1

해야합니다. 가비지 수집은 예측할 수없는 시간에 실행됩니다. 참조되지 않은 개체는 가비지 수집되지만 언제 알 수 없습니다.

관련 문제