문제
C#에서 이벤트 처리기를 제거하기 위해 구문에 의해 혼란스러워집니다.
Something += new MyHandler(HandleSomething); // add
Something -= new MyHandler(HandleSomething); // remove
"새"는 각 줄에 새 개체를 생성하므로 하나의 객체를 추가 한 다음 다른 객체를 제거하도록 요청합니다.
이것이 작동 할 수있는 표지 아래에서 실제로 무슨 일이 일어나고 있습니까?
구문에서는 분명하지 않습니다.
해결책
+=와 -=는 add ()라는 내장 내부 메소드의 구문 단축키이며, remove ()는 대의원이 개인 필드로 가지고있는 내부 링크 대표 목록에 대한 포인터를 추가하거나 제거합니다. 제거 할 때 링크 된 목록의 헤드에서 시작하여리스트 () 메소드에 전달 된 것과 "동일"을 찾을 때까지 목록의 각 대의원을 한 번에 하나씩 검사합니다. (사용 -= 구문)
그런 다음 링크 된 목록에서 해당 하나를 제거하고 연결된 목록을 패치하여 연결성을 유지합니다 ...
이러한 맥락에서, 'equals'메소드 (delegate ()의 경우)는 대의원의 대상 만 비교할 수 있도록 재정의됩니다. ...
다른 팁
"New MyHandler"는 실제로 중복됩니다. 당신은 단순히 할 수 있습니다
Something += HandleSomething; // add
Something -= HandleSomething; // remove
C#의 모든 이벤트는 멀티 캐스트 대의원이므로 += 및 -= 구문은 호출 될 대표단 목록에 대의원을 추가/제거하고 있음을 나타냅니다.
무대 뒤에서 무슨 일이 일어나고 있는지에 관해서는 내가 찾은 최고의 설명은 Jon Skeet 's.
이벤트를 이벤트가 제기 될 때 실행되는 위임 된 논리의 자리 표시 자 방법으로 생각할 수 있습니다. 단일 이벤트에는 여러 구독자 (다중 캐스팅)가있을 수 있으므로 += 및 -= 구문은 단일 이벤트 핸들러가 첨부 또는 제거되는 방법입니다. 단순히 할당을 수행하면 이벤트의 구독을 재설정하여 원치 않는 부작용이 발생할 수 있습니다.
편집하다: 이 링크 C#에서 이벤트에 대해 자세히 설명합니다.