문제

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#에서 이벤트에 대해 자세히 설명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top