이벤트 발신자는 항상 일반 객체 여야합니까?


10

C #에서 이벤트를 프로그래밍 할 때는 다음 과 같은 형식으로 대리자를 만드는 것이 좋습니다 .

delegate XEventHandler(object sender, XEventArgs e);

내 질문은 대리인의 첫 번째 주장에 object sender있습니다. 항상 일반이어야 object합니까? 발신자 유형이 있으면 object항상 이와 비슷한 코드가 생성됩니다.

val = ((ConcreteType)sender).Property;

또는 훨씬 더 장황한

ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }

강력한 형식의 보낸 사람에 대한 한 가지 주장은 다른 개체가 형식에 대해 걱정하지 않고 이벤트를 전달할 수 있다는 것 입니다. 이것은 GUI 환경에서 의미가 있지만 GUI 외부에서 이점이 있는지 확실하지 않습니다.

발신자의 클래스가 항상 (적어도 추상 클래스) 알려진 경우 어떻게해야합니까? 예를 들어, ListChanged추상 List클래스 에서 이벤트를 구현 하고 있고 다른 클래스 에서 이벤트 를 상속하려는 경우 (예 :) LinkedList, ArrayList발신자 유형으로 내 델리게이트를 정의해도 괜찮 List습니까?

delegate ListChangedEventHander(List sender, ListChangedEventArgs e);

아니면 기존 방식 object sender을 더 구체적인 유형 으로 변경하면 단점이 있습니까?

답변:


10

이 시점에서 그것은 대부분 (꽤 강한) 관습입니다. 즉, 해당 규칙을 따르지 않는 라이브러리를 작성하면 이상 할 것입니다.

이벤트 디자인 가이드 라인은 말한다 :

DO 사용을 object이벤트 처리기의 첫 번째 매개 변수의 유형으로, 그리고 전화 sender.

그러나 현재 지침에 따르면 이벤트에 대한 사용자 지정 대리자를 정의하지 EventHandler<T>말고 가능한 경우 대신 사용하십시오 .

디자인에 관해서는, 원래 이벤트 디자이너가 예견하지 않은 상황에서도 이벤트 핸들러의 재사용을 촉진한다고 생각합니다.


2
어 Microsoft ... 마이크로 소프트가 모든 사람에게 적용 할 수 있도록 가이드 라인을 일반화하기로 결정했다고해서 다른 사람들이 가이드 라인을 따르는 것이 좋은 생각은 아닙니다. 확률은 "다른 사람"이 수백만 명의 다른 개발자가 사용할 코드를 작성하지 않을 가능성이 큽니다. 나는 당신이 제공 한 링크에서 약 2/3의 권장 사항을 울었습니다.
Dunk

사실,이 "가이드 라인"은 Windows API의 헝가리 표기법과 비슷합니다. 정말 훌륭한 이유로 누군가 그것을 시작한 다음 다른 사람들이 그것을 남용하기 시작했습니다. 지침이있을 때는 그 지침 뒤에 합당한 이유가 더 있습니다. 그리고 무엇 나는 이 가이드 라인에 대한 이유가 생각 System.Windows.Forms네임 스페이스 이벤트가 가장 많이 사용되는 곳이며,이에 가입하는 것이 제작 Click의 이벤트 ButtonCheckBox. 따라서 발신자 일반적이어야합니다. ...
sampathsris

... 그러나 다른 더 구체적이고 포함 된 기능 영역과 관련하여 발신자는 일반 클래스 일 필요는 없습니다. Lists 의 클래스 계층 구조에 대한 나의 예를 다시 참조하십시오 .
sampathsris

11
@ 덩크 : 그게 요점입니다. 이 지침은 기본적 으로 다른 사람 이 사용하는 코드와 관련된 프레임 워크 디자인 지침에서 발췌 한 것 입니다. 최상의 솔루션이기 때문이 아니라 가장 놀라운 방법은 아닙니다. 이것이 프레임 워크에 가장 적합한 옵션 입니다 . 더 작은 라이브러리의 경우 유스 케이스가 올바르게 지정되면 지침 중 적은 부분이 적용됩니다. Microsoft는이 책의 시작 부분에서 명시 적으로 그렇게 말합니다.
Magus

1
나는 대답으로 논쟁하지 않고 있으며, 평판이 좋은 출처에서 나왔기 때문에 그것을 찬성했습니다. 나는 단지 지침을 사용하지 않을 것이라고 말하고 있습니다. 이벤트가 특정 데이터를 보내면 특정 데이터를 보내면됩니다. 또한 이벤트 기능을 사용 목적으로 사용하면 이벤트 기능이 제대로 작동합니다.
Dunk

0

권장 이유는 기존 코드, 특히 공용 인터페이스를 반드시 변경하지 않아도되는 향후 변경을 허용하기 때문입니다.

이벤트 메커니즘 자체는 여전히 "VB6"스타일 이벤트에 사용될 수 있지만 서명을 변경해야하는 경우 (또는 더 나쁜 경우 : 동일한 이벤트의 새 버전을 작성) 기존의 모든 소비자를 변경해야합니다. 권장 방법을 사용하면 최신 항목이 기존 항목을 상속하는 한 기존 코드를 수정하지 않고 서명을 업데이트 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.