2017-12-07 2 views
2

:C#을 내장 이벤트에 다음 코드 조각을 읽은 후

[SerializableAttribute] 
public delegate void EventHandler<TEventArgs> 
(
    object sender, 
    TEventArgs e 
) 

왜 마이크로 소프트 사람이 바로 보낸 매개 변수와 같은 "E"매개 변수에 대한 개체 유형을 포기하지 않았다? 여기서 중요한 일을 놓친 거니?

+0

Yes (예)를 입력하지만, 왜이 보낸 사람을 위해 또한 일반적인를 포기하지 않았다? –

+1

@ Mu'menTayyem 왜냐하면 발신자가 솔직히 훨씬 덜 재미 있기 때문입니다. (때로는 간단히 'null'입니다.) * * 대부분의 시간 * 사람 *은 이미 * 발신자가 누구인지를 알고 있습니다. 때로는 "어떤 버튼"을 확인해야하지만 유형을 알지도 못하면 참조 확인으로 할 수 있습니다. * 다른 사람들은 이벤트 전달을 사용합니다. 레벨간에 서명이 바뀌면 수행하기가 쉽지 않습니다. –

답변

7

만약 그렇게했다면 사람들은 항상 args 매개 변수를 사용해야합니다.

public delegate void SomeInterestingEventHandler(
    object sender, SomeInterestingEventArgs args); 

당신이 것 인 :이 선언의 필요성을 대체하는 편리한 방법입니다

obj.SomeEvent += (sender, args) => Console.WriteLine(args.SomeSpecificProperty); 

:

public event EventHandler<SomeInterestingEventArgs> SomeEvent; 

과 : 요점은 당신이 같은 일을 할 수 있다는 것입니다 이것없이해야합니다.

+0

그게 내가 생각하기도하지만, 발신자에게도 일반적인 이유가 아닌가? –

+0

@ Mu'menTayyem 하단에 추가 사항을보고 귀하의 질문에 대한 내 의견 –

+0

알겠습니다. 고마워, 친구. –

3

고유 한 이벤트 args 클래스를 만들 수 있습니다. 여기에는 몇 가지 유용한 속성이 있습니다. 마우스 클릭 이벤트 args (적절한 이름을 기억할 수 없음)와 마찬가지로 클릭 한 포인트를 알려주는 X 및 Y 소품이 있습니다. 제네릭 덕분에 여러분은 평범한 오래된 물체를 가지고 던지기를 할 필요가 없습니다. 당신은

MyEventHandler<MouseClickedEventArgs>(object sender, MouseClickedEventArgs e). 

이있을 것이다 그리고 모든 것을 강하게

관련 문제