13

개체를 null로 설정하면 개체 이벤트에 첨부 된 이벤트 핸들러가 정리되는지 궁금합니다.

을 포함한다.

Button button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;

button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;

기타...

이로 인해 메모리 누수가 발생합니까?

3 답변


16

다른 언급이없는 경우button어디서나 이벤트가 발생하면 메모리 누수를 피하기 위해 이벤트 핸들러를 제거 할 필요가 없습니다. 이벤트 핸들러는 일방적 인 참조이므로, 이벤트 핸들러는 이벤트가있는 오브젝트가 수명이 오래 걸릴 때만 제거하면됩니다.핸들러(예 : 핸들러 메서드가있는 객체)가 오래 가지 못하게해야합니다. 귀하의 예에서는 그렇지 않습니다.


  • 응용 프로그램 막대의 이벤트 처리기가 명백하게 제거 할 필요가 없다는 것을 의미합니까 (예 : 상태 변경)? - Hans Petter Naumann
  • 이것은 반대의 상황입니다. AppBar는 수명이 긴 개체이며 최소한 이벤트 핸들러는 AppBar이 활성 상태 인 동안 대리자가 살아있는 것을 나타내는 개체를 유지합니다. 따라서이 작업을 원하지 않을 수 있습니다. 반면 핸들러가 막대를 소유 한 윈도우의 메소드 인 경우 문제가되지 않습니다. - Pavel Minaev

11

요약 : 이벤트 원본 / 게시자가 오래 지속되고 구독자가 아닌 경우 명시 적으로 구독을 취소해야합니다. 이벤트 원본이 구독자의 수명을 초과하면 등록 된 모든 구독자는 구독을 취소하고 이벤트 게시자의 알림 목록에서 자신에 대한 참조를 제거하지 않는 한 이벤트 원본 (GC가 수집하지 않음)에 의해 "활성"상태로 유지됩니다.

또한 이것은C #에서 이벤트 처리기를 명시 적으로 제거해야합니까?좋은 제목과 대답이 있습니다. 그래서 투표를 닫습니다.


  • Q & A를 보았습니다. 제 질문은 훨씬 간단하고 훨씬 간단한 대답이 필요합니다. - Damien

8

토론보기여기 "마지막 질문 : 이벤트 처리기를 제거해야합니까?"

결론 :   이벤트에 참석 한 대표자   클래스 자체 외부; 즉   당신은 외부 이벤트에 가입하고,   구독을 종료해야합니다.   완료되었습니다. 그렇게하지 않으면   당신의 목표는 오래 살았습니다.   필요한.

연결된 질문


관련된 질문

최근 질문