
비교 차트
비교의 근거 | 대의원 | 이벤트 |
---|---|---|
기본 | 대리자는 메서드 참조를 보유합니다. | 이 이벤트는 대표단에게 제공된 계층화 된 추상화입니다. |
통사론 | delegate return_type delegate_name (parameter_list); | 이벤트 event_delegate event_name; |
예어 | 델리게이트는 "델리게이트"라는 키워드를 사용하여 선언됩니다. | 이벤트는 키워드 "이벤트"를 사용하여 선언됩니다. |
선언 | 대리자는 모든 클래스 외부에서 선언됩니다. | 이벤트는 클래스 내에서 선언됩니다. |
호출 | 메소드를 호출하려면 위임자에게 참조되어야합니다. | 메소드를 호출하려면 해당 메소드에 이벤트를 지정해야합니다. |
공분산 및 반 공분산 | 이들은 대리인에게 유연성을 제공합니다. | 그런 개념은 없습니다. |
이벤트 접근 자 | 그런 개념은 없습니다. | 이벤트 처리기 목록을 관리합니다. |
의존 | 대의원은 사건과 무관합니다. | 대리자가 없으면 이벤트를 만들 수 없습니다. |
대표자의 정의
C #에서는 대리자가 메서드를 참조하는 함수 포인터로 사용됩니다. 특히 할당 된 메서드를 참조하는 개체입니다. 다른 메소드의 참조를 보유 할 수 있기 때문에 같은 위임자를 여러 메소드를 참조하는 데 사용할 수 있지만 한 번에 하나씩 참조 할 수 있습니다. 대리자에 의해 호출되는 메서드는 런타임에 결정됩니다. 위임을 선언하는 구문은 다음과 같습니다.
delegate return_type delegate_name (parameter_list);
여기서 return_type은 메서드에서 반환하는 값의 형식을 선언합니다.이 형식은 delegate에 의해 호출되며 delegate_name은 대리자의 이름입니다. parameter_list는 델리게이트가 호출 할 메소드에 필요한 매개 변수 목록을 정의합니다.
대표자에 관해 기억해야 할 몇 가지 중요한 사항이 있습니다. 시그니처와 리턴 유형과 일치하는 메소드를 호출 할 수 있습니다. 대리자는 인스턴스 메서드 또는 정적 메서드를 모두 호출 할 수 있습니다. 인스턴스 메소드를 호출하면 메소드를 호출하는 객체의 도움을 받아야합니다. 대리인은 멀티 캐스팅을 지원합니다. 즉, 대리자를 참조하는 대리인이 호출 될 때 자동으로 호출되는 메서드를 연결할 수 있습니다. 델리게이트 객체를 만들고 "+ ="연산자를 사용하여 체인에 하나씩 메소드를 할당하면됩니다. 또한 "- ="연산자를 사용하여 메소드의 체인을 풀 수 있습니다.
위임자에게 유연성을 추가하는 기능은 공분산 (Covariance) 및 반 공백 (Contravariance)입니다. 공분산과 Contravariance는 대리자에게 할당 된 메서드의 반환 형식과 서명이 대리자의 서명과 다른 조건을 허용합니다.
- 공분성을 사용하면 메서드의 반환 형식이 대리자의 반환 형식을 지정하는 클래스에서 파생 된 클래스 인 메서드를 대리자에 지정할 수 있습니다.
- Contravariance를 사용하면 메서드의 매개 변수 형식이 대리자의 매개 변수로 지정된 클래스의 기본 클래스 인 메서드를 대리자에 지정할 수 있습니다.
이벤트의 정의
이벤트는 수행 된 조치로 오브젝트의 상태를 변경합니다. 이벤트는 대리자를 사용하여 선언되며 이벤트를 선언 할 수없는 대리자는 존재하지 않습니다. 이벤트가 대리자에게 캡슐화를 제공한다고 말할 수 있습니다. 이벤트와 이벤트 핸들러 인 이벤트를 처리 할 때는 두 가지 중요한 요소가 있습니다. 객체가 이벤트에 관심이있는 경우 해당 특정 이벤트에 대한 이벤트 핸들러를 등록합니다. 이벤트가 시작될 때마다 등록 된 이벤트 핸들러가 호출됩니다. 사건의 선언은 다음과 같습니다 :
이벤트 event_delegate event_name;
여기서, "이벤트"는 이벤트의 선언을 나타내는 키워드입니다. 그런 다음 event_delegate는 이벤트를 지원하는 위임자의 이름을 표시합니다. 그런 다음 event_name은 이벤트의 이름입니다.
이벤트를 다룰 때 기억해야 할 몇 가지 중요한 사항이 있습니다. 위임자와 마찬가지로 이벤트도 멀티 캐스트 될 수 있습니다. 즉 이벤트 처리기에 연결 (등록) 된 여러 객체가 이벤트 발생시 응답합니다. 이벤트 처리기는 연산자 "+ ="를 사용하여 체인에 추가 할 수 있으며 "- ="연산자를 사용하여 체인에서 분리 할 수 있습니다. 정적 및 인스턴스 메서드를 모두 이벤트 처리기로 사용할 수 있습니다. 이벤트 접근자는 이벤트 핸들러 목록의 구현을 제어 할 수 있습니다.
인터페이스에는 이벤트가 포함될 수 있습니다. 접근 자 기반 이벤트는 추상이 될 수 없지만 이벤트도 추상이 될 수 있습니다. 이 이벤트는 가상 일 수 있으며 파생 클래스에 의해 재정의 될 수 있습니다.
C #에서 대리인과 이벤트 간의 주요 차이점
- 대리자는 메서드 참조를 유지하는 함수 포인터로 사용되는 개체입니다. 반면에, 이벤트는 대표자에게 추상화를 제공합니다.
- 델리게이트를 선언하는 데 필요한 키워드는 델리게이트 인 반면, 이벤트를 선언하는 데 필요한 키워드는 이벤트 입니다.
- 대리자는 클래스 외부에서 선언되는 반면 이벤트는 클래스 내부에서 선언됩니다.
- 대리자 개체를 사용하여 메서드를 호출하려면 메서드를 대리인 개체로 참조해야합니다. 다른 한편, 이벤트 객체를 사용하여 메소드를 호출하려면 메소드가 이벤트 객체를 참조해야합니다.
- 공분산 및 Contravariance는 대리자 객체에 유연성을 제공합니다. 반면에, 사건에는 그런 개념이 없다.
- Event Accessor는 이벤트 핸들러 목록을 처리하지만 델리게이트는 그런 개념이 없습니다.
- 대리인은 이벤트에서 독립적이지만 대리자가 없으면 이벤트를 만들 수 없습니다.
결론:
대리자는 이벤트를 지원할 때 유용하며 런타임에 메서드를 실행할 수있는 기능을 제공합니다. 이벤트 접근자는 다중 스레드 응용 프로그램에서 이벤트 처리기를 동기화 할 수있게합니다.