13

.ShowDialog () 메서드를 통해 열린 양식이 있다고 가정합니다.

어떤 시점에서 양식의 일부 컨트롤에 일부 이벤트 처리기를 연결합니다.

을 포함한다.

// Attach radio button event handlers.
this.rbLevel1.Click += new EventHandler(this.RadioButton_CheckedChanged);
this.rbLevel2.Click += new EventHandler(this.RadioButton_CheckedChanged);
this.rbLevel3.Click += new EventHandler(this.RadioButton_CheckedChanged);

양식이 닫히면이 핸들러를 제거해야합니다.

현재 FormClosing 이벤트가 발생하면이 작업을 수행하고 있습니다.

을 포함한다.

private void Foo_FormClosing(object sender, FormClosingEventArgs e)
{
    // Detach radio button event handlers.
    this.rbLevel1.Click -= new EventHandler(this.RadioButton_CheckedChanged);
    this.rbLevel2.Click -= new EventHandler(this.RadioButton_CheckedChanged);
    this.rbLevel3.Click -= new EventHandler(this.RadioButton_CheckedChanged);
}

그러나 Dispose () 메서드에서 핸들러가 제거 된 몇 가지 예제를 보았습니다.

이 작업을 수행하는 데 '최상의 방법'이 있습니까?

(C #, Winforms, .NET 2.0 사용)

감사.


  • 왜 너 자신을 돌보고 싶어? GC가 당신을 위해 이것을 할 것입니다. - Fabian
  • @ Fabian : 이미 그 답변을 알고 있다면 질문을 게시하지 않았을 것입니다. :) - Andy

2 답변


18

이 경우 핸들러를 제거 할 필요가 없습니다. 양식이나 단추가 양식 외부의 코드에 의해 참조되지 않으므로 전체 오브젝트 그래프가 가비지 수집됩니다.


  • 그렇기 때문에 양식이 처리 되었기 때문에 모든 컨트롤이 너무 커서 이벤트 처리기에 대한 링크가 없다는 의미입니까? 나는 언제나 내가 무언가를 창조했다면 그것도 정리해야한다고 생각했다. - Andy
  • 그렇다. 객체 중 하나가 다른 객체의 이벤트 대상이되는 객체 컬렉션을 원한다면 핸들러를 제거해야합니다. 그러나이 경우 개체 (폼 + 단추) 만 서로를 참조합니다. - Ben M
  • 감사합니다 벤, 이해했습니다. - Andy

3

아니요, 닫는 양식의 컨트롤에서 이벤트 처리기를 제거 할 필요가 없습니다. 그들은 모두 함께 처리됩니다.

아마도 브라우저에서 메모리 누수가 발생하지 않도록 이벤트 핸들러를 제거해야하는 웹 페이지를 생각할 것입니다.


  • 서버 측 이벤트 핸들러가 브라우저에서 메모리 누수를 일으 킵니까? - Chris Taylor
  • 아니요, 브라우저 사이드 이벤트 핸들러는 브라우저에서 메모리 누수를 일으 킵니다. 이전 브라우저에서 페이지로드 이벤트 등을 연결하면 URL이 다른 페이지로 변경 될 때 페이지로드 이벤트가 이전 페이지에 연결됩니다. 따라서 메모리가 누출됩니다. - dthorpe

관련된 질문

최근 질문