경우 가입자을 볼 수있는 객체 외부에서 방법은 없습니다 - 필요한 정보를 바로 볼 수 없습니다.
내부적으로는 복잡 할 수도 있지만 구현의 세부 사항에 따라 달라질 수 있지만 (아직 완료되지는 않았습니다.) 수행 할 수 있습니다.
유용 할 수있는 해결 방법은 에 처리기를 제거하는 것입니다. 예외는 발생하지 않습니다.
그래서이 코드는 유효합니다 : 이미 이벤트에 가입하는 경우
myConnection.Closing -= ConnectionClosingHandler;
myConnection.Closing += ConnectionClosingHandler;
는, 첫 번째 줄은 구독을 제거합니다.
이 아닌 경우 이미에 가입하면 첫 번째 줄에는 아무런 변화가 없습니다.
두 번째 줄은 새 구독을 연결하여 여러 번 알림을받지 않습니다.
public event PropertyChangedEventHandler Changed;
컴파일러는 모든 가입자를 저장 형 PropertyChangedEventHandler
의 멤버 변수를 만듭니다 당신이 정상 이벤트를 선언 할 때
는 마지막 글 머리에 대답합니다. 원하는 경우 저장을 대신 할 수 : 구독을 수정하는
-=
및
+=
의 사용은 문법 설탕이
public event PropertyChangedEventHandler Changed
{
add { ... }
remove { ... }
}
하지
- 대의원은 불변이며, 추가 또는 핸들러를 제거 할 때 새로운 인스턴스가 반환된다 . 이 작동 방식에 대한 자세한 내용은
Delegate
및
MulticastDelegate
(두 MSDN 링크)을 참조하십시오.
지우기 처리기 : http://stackoverflow.com/questions/91778/how-to-remove-all-event-handlers-from-a-control –
이것은 좋은 코딩 원칙을 위반하는 * 매우 * 강한 것입니다. * event * 키워드가 처음 존재하는 이유 중 하나는 매우 효과적입니다. –
@ 한스 패 탄트 (Hans Passant) : 이벤트 구독 목록을 없애기 위해 폐기 된 개체에 대해서는 좋은 생각이라고 생각합니다. 그렇지 않으면 폐기 된 객체에 대한 실시간 참조가 있으면 객체의 모든 이전 구독자도 살아있게됩니다. 더 이상 이벤트를 제기하지 않을 처분 된 객체가 구독 목록을 죽이지 않아야하는 이유가 있습니까? – supercat