2009-09-28 8 views
26

잠시 동안이 작업을 해왔지만 이벤트 처리기를 제거 할 때마다 new을 사용하고 있다는 사실을 눈치 채지 못했습니다. 나는 새로운 물체를 만들어야 하나?C# 이벤트 핸들러 제거

기본적으로 1과 2 사이에 차이가 있습니까?

  • ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

    ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

    편집 : 이 좋아이 중복입니다. 미안합니다. 답변 됨 here 게시 됨.

    동일한 대상, 메서드 및 호출 목록을 가진 동일한 형식의 대리자 두 개가 동일한 것으로 간주됩니다.

    답변

    29

    2는 1에 대한 구문 설탕이므로 1과 2 사이에는 차이가 없습니다. 실제 메서드 이름 대신 클래스 수준 대리자 인스턴스 필드를 참조한 경우에만 차이가 있습니다 컴파일 된 일리노이.

    런타임시 어떤 일이 발생하는지에 관해서는 Remove 메서드는 전달 된 대리자 인스턴스가 Add 메서드에 전달 된 인스턴스와 같은지 여부에 상관하지 않습니다. 왜 그런지는 잘 모르겠지만, 위임 인스턴스는 항상 인턴이되어 있다고 생각합니다.

    EDIT : 존 소총 이벤트 Remove있어서 오히려 + 참조 평등 인턴보다리스트에서 제거하는 대표 값 결정하는 참가 (Delegate.Equals)를 사용하는 것을 말한다. 같은 최종 결과, 다른 방법. :-)

    +0

    대리자는 메서드 및 인스턴스 (선택 사항)에 대한 참조 일 뿐이므로 위의 두 인스턴스를 비교하면 등식을 판단하기에 충분합니다. – Botz3000

    +0

    네,하지만 일반적으로 말해서, 임의의 참조 타입에서'new T()'를 두 번 호출하면 두 개의 다른 인스턴스를 얻을 수 있습니다. 이것은 대표자의 경우가 아니기 때문에, 델리게이트 생성자가'Type' 클래스처럼 인스턴스를 자동으로 인턴하는 것으로 추론합니다. –

    +0

    인턴 - 그게 무슨 뜻입니까? 답변 해주셔서 감사합니다. 이런 종류의 문제는 제가 가진 의심입니다. 핸들러를 추가하고 제거 할 때 새 인스턴스를 만들 때 새 인스턴스를 만들 때 새로운 것에 대해 궁금합니다. 엄청 이상해. – Sharun

    13

    두 번째 버전은 첫 번째 버전과 같습니다. 더 짧은 구문을 사용합니다. 이것은 C# 2.0에서 구현되었습니다.