2017-05-16 11 views
3

고전 일반적으로 C 번호 이벤트는 이러한 매개 변수가 있습니다.이벤트 패턴에서 기본 클래스로 EventArgs의 목적은 무엇입니까?</p> <pre><code>(object sender, EventArgs e) </code></pre> <p>내가 <code>EventArgs</code> 대한 유도의 <code>e</code> 인수에 대한보다 구체적인 서명 이벤트를 구현할 수 있습니다

이제 EventArgs 같은 기본 클래스의 목적은 무엇인가? 내 말은 ... 비어있는거야. 기본/추상/가상 속성이나 필드 또는 기타 다른 것은 없습니다.

왜 기본 이벤트의 매개 변수를 그냥 아래와 같이하지? 이다

(object sender, object eventArgs) 

, 왜 어떤 구현 및 특정 이벤트 인수 매개 변수를 사용하여 모든 이벤트는 EventArgs에서가 아니라 단순한 object에서 파생?

위 질문은 다음 질문과 동일합니다. 일반적인 형태의 이벤트 위임은 다음과 같습니다

delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) 

및 제한 매개 변수 e에 넣어되지 않습니다. 하지만 where TEventArgs : EventArgs과 같은 것을 기대했을 것입니다 ...

+0

* 이벤트 데이터를 포함하는 클래스의 기본 클래스를 나타냅니다 및 이벤트 데이터 * 포함하지 않는 이벤트에 사용할 값을 제공합니다 - [문서]에서을 (https://msdn.microsoft.com/en-us을 /library/system.eventargs). 나는 그것이 자명하다고 믿는다. –

+1

@FedericoDipuma 글쎄, * 일종의 *,하지만'object'도 그 일을 할 것입니다 ... 예외적으로'.Empty'를 제외하면 –

+1

@MarcGavell 물론 당신 말이 맞습니다. 나는 그 자체로 문서 자체가 인정하기 때문에,'EventArgs'를위한 기술적 인 이유가 없다는 것을 지적하고있었습니다. 그냥 상속 일관성. –

답변

5

객체는 int, double 등 boxing and un-boxing issues을 소개 할 값 유형을 배제하지 않습니다. 객체에 대한 기본 클래스를 사용하는 선택은 강력한 형식의 객체를 API 전체에 전달하도록 선택하는 것입니다.

강력하게 형식화 된 프로그래밍 언어를 사용하여 모든 점을 무효로하는 것처럼 내가 object type의 보급 된 사용을 보았을 때 나는 가려워하는 경향이 있습니다. 자바 스크립트에 친숙한 사람이라면 누구든지 자바 스크립트에 익숙하지만 strongly typed programming paradigm을 향해 노력하고 있습니다.

편집 :reference types vs value types을 전달하는 이벤트 모델 간의 구별을 자세히 설명합니다. 대리자가 이벤트를 처리 할 때 많은 사람들이 이벤트를 제기 할 때 자주 수행하는 이벤트의 데이터를 변경하면 전달 된 데이터가 값 유형 인 경우 값으로 전달 된 복사본을 변경하는지 또는 값 유형에 대한 원래의 참조는 물론 원본을 변경하고 싶을 것입니다. 참조 유형의 전달은 .NET 이벤트 모델에서 매우 중요한 디자인 결정입니다.

+0

좋아, 유용한 대답,하지만 내가 어디에서 지적한'어디 TEventArgs : EventArgs'와 같은 제약의 부족에 대해? 그것은 MS 팀이 어떤 점에서 패턴에 대한 아이디어를 바꾼 신호입니까? –

+0

아니요. 이것이 어떻게 패턴과 완전히 일치하지 않는지 나는 알 수 없습니다. API에서 MS가 .NET의 모든 이벤트가 EventArgs 참조 유형을 전달하기를 원한다는 것이 확실합니다. – Mick

+1

아마 Generics가 EventArgs 대신 .NET 1.0에 있었다면'where TEventArgs : class' – Mick