Designer에서 VS 버튼을 두 번 클릭하면이 Click 이벤트 핸들러가 생성됩니다.모든 이벤트 처리기를 구독 취소해야합니까?
구독 코드는 designer.cs에 있습니다.
내가 처분 할 때 양식을 취소해야합니까?
또한 양식에있는 모든 컨트롤은 양식 삭제시 처리됩니까? 실제로 각 컨트롤에서 재귀 적으로 처리를 호출합니까?
Designer에서 VS 버튼을 두 번 클릭하면이 Click 이벤트 핸들러가 생성됩니다.모든 이벤트 처리기를 구독 취소해야합니까?
구독 코드는 designer.cs에 있습니다.
내가 처분 할 때 양식을 취소해야합니까?
또한 양식에있는 모든 컨트롤은 양식 삭제시 처리됩니까? 실제로 각 컨트롤에서 재귀 적으로 처리를 호출합니까?
자신의 이벤트에 연결하는 경우 Dispose에서 이벤트를 언훅하지 않아도됩니다.
다른 개체에 이벤트를 연결하는 경우에만 걱정할 필요가 있습니다. 그 이유는 이벤트 후크 (event hooks)가 구독자에게 참조를 유지시키기 때문입니다. unhook에 실패 할 경우 관측 가능 항목이 아직 살아있는 한 가비지 수집을하지 않습니다.
자신 만의 이벤트를 후크하면 자신에 대한 참조가 순환으로 이루어 지므로 걱정할 필요가 없습니다.
저는 이러한 이유로 느슨하게 결합 된 이벤트 패턴을 지원하게되었습니다. 닷넷에서 메모리 누수가 가장 많이 발생하는 곳입니다. 나는 Event Aggregator 패턴 (weak events)을 선호합니다. 이벤트 핸들러 코드만큼
양식 자체에, 당신은 이벤트를 취소 할 필요가 없습니다 것 - 양식 자체가 파괴 될대로 컨트롤에 매달려 이벤트 핸들러가 없을 것 같은
"실제로 각 컨트롤에서 재귀 적으로 처리할까요?"라는 질문에 대한 대답은 '예'입니다.
간단한 테스트는 컨트롤의 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);
}
}
큰 설명 주셔서 감사합니다. 당신이 너 자신에게 매달릴 때 unhook하지 않기를 위해 완전한 이해된다. – pdiddy