2009-08-27 8 views
10

Designer에서 VS 버튼을 두 번 클릭하면이 Click 이벤트 핸들러가 생성됩니다.모든 이벤트 처리기를 구독 취소해야합니까?

구독 코드는 designer.cs에 있습니다.

내가 처분 할 때 양식을 취소해야합니까?

또한 양식에있는 모든 컨트롤은 양식 삭제시 처리됩니까? 실제로 각 컨트롤에서 재귀 적으로 처리를 호출합니까?

답변

15

자신의 이벤트에 연결하는 경우 Dispose에서 이벤트를 언훅하지 않아도됩니다.

다른 개체에 이벤트를 연결하는 경우에만 걱정할 필요가 있습니다. 그 이유는 이벤트 후크 (event hooks)가 구독자에게 참조를 유지시키기 때문입니다. unhook에 실패 할 경우 관측 가능 항목이 아직 살아있는 한 가비지 수집을하지 않습니다.

자신 만의 이벤트를 후크하면 자신에 대한 참조가 순환으로 이루어 지므로 걱정할 필요가 없습니다.

저는 이러한 이유로 느슨하게 결합 된 이벤트 패턴을 지원하게되었습니다. 닷넷에서 메모리 누수가 가장 많이 발생하는 곳입니다. 나는 Event Aggregator 패턴 (weak events)을 선호합니다. 이벤트 핸들러 코드만큼

+0

큰 설명 주셔서 감사합니다. 당신이 너 자신에게 매달릴 때 unhook하지 않기를 위해 완전한 이해된다. – pdiddy

1

양식 자체에, 당신은 이벤트를 취소 할 필요가 없습니다 것 - 양식 자체가 파괴 될대로 컨트롤에 매달려 이벤트 핸들러가 없을 것 같은

2

"실제로 각 컨트롤에서 재귀 적으로 처리할까요?"라는 질문에 대한 대답은 '예'입니다.

간단한 테스트는 컨트롤의 Dispose 메서드에 중단 점을 넣어 수행 할 수 있습니다.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.Controls.Add(new SuperButton()); 
    } 
} 

public class SuperButton : Button 
{ 
    protected override void Dispose(bool disposing) 
    { 
     //Place breakpoint on the line below 
     base.Dispose(disposing); 
    } 
} 
관련 문제