2017-03-10 4 views
0

게시자 이벤트에 구독자로 '일반'메서드를 추가하고 대리자를 첨부하는 것이 왜 좋은지 이해하기가 어렵습니다. 예를 들어일반 구독자 메서드를 이벤트에 추가하는 것과 익명 이벤트 처리기를 추가하는 것의 차이점은 무엇입니까?

...

public class Caller 
{ 
    public string Name { get; set; } 
    public event EventHandler<RuedaEventArgs> MakeRuedaCall; 

    public virtual void OnMakeRuedaCall(RuedaEventArgs args) { 
     if (MakeRuedaCall != null) { 
      MakeRuedaCall(this, args); 
     } 
    } 
} 

이 내가 정의하고 이벤트를 발생 내 게시자 클래스입니다. 나는 또한 커스텀 이벤트 인수를 사용하고있다.

public class Salsera { 
    public Salsera(Caller caller) { 
     caller.MakeRuedaCall += MakeMovement; 
    } 
    public void MakeMovement(object source, RuedaEventArgs args) { 
     if (args.CallName == "Vacilala") { 
      Turn(); 
     } 
     if (args.CallName == "Patin") { 
      MoveToOutside(); 
     } 
    } 
    private void MoveToOutside() { 
     Console.WriteLine("Ladies move to the outside...."); 
    } 
    private void Turn() { 
     Console.WriteLine("Ladies turn...."); 
    } 
} 

이 클래스는 생성자의 이벤트 구독자로 메서드를 추가하는 클래스입니다.

가정하자 나는 다음이 다른 곳에서 ...

Caller matt = new Caller(); 

EventHandler<RuedaEventArgs> anonyMouseFunc = (sender, eventArgs) => 
{ 
    switch (eventArgs.CallName) { 
     case "Patin": 
      Console.WriteLine("Adding a new subscriber for Patin"); 
      break; 
     case "Vacilala": 
      Console.WriteLine("Adding a new subscriber for Vacilala"); 
      break; 
    } 
}; 
matt.MakeRuedaCall += anonyMouseFunc; 

이 바보 같은 질문처럼 보이지만 당신은 왜 '정상적인'방법을 구독 할 수 있음을 경우 (가 위임 signiture 일치 가정) 죄송에 이벤트 및 익명 메소드를 이벤트에 대한 위임자로 사용합니다.

public event EventHandler<RuedaEventArgs> MakeRuedaCall;은 두 옵션을 모두 어떻게 처리합니까?

많은 감사,

+0

'event'는 아무 것도 처리하지 않습니다. 컴파일러는 메소드 생성에 신경을 쓰고 그것을'event' 델리게이트에 등록합니다. 그래서'event'를 호출하면 메소드가 실행됩니다. – dcg

+0

이름이없는 이벤트 처리기를 추가하거나 이름이없는 이벤트 처리기를 추가하는 것은 왜 다른 * 것이라고 생각하십니까? 방법의 이름의 존재 또는 부족이 사건 발생시 어떻게 처형 될 수 있는지에 영향을 미칩니 까? – Servy

답변

2

이 바보 같은 질문처럼 보이지만 당신은 왜 '정상적인'방법을 구독 할 수 있음을 경우 이벤트에 (가 위임 signiture 일치 가정), 또한 익명 죄송합니다 메서드를 이벤트에 대한 대리자로 사용합니다.

두 경우 모두 대리인을 가입하고 있습니다. 이 경우 :

caller.MakeRuedaCall += MakeMovement; 

... 당신 대리자 인스턴스로 (사양 용어의 메소드 그룹 인) MakeMovement를 변환하는 방법 그룹 변환을 사용하고 있습니다. 단지 이벤트에 대한

EventHandler<RuedaEventArgs> handler = MakeMovement; 
caller.MakeRuedaCall += handler; 

일반적인 방법에서 위임을 만들 수있는이 기능되지 않습니다

caller.MakeRuedaCall += new EventHandler<RuedaEventArgs>(MakeMovement); 

또는 다른 식으로 생각하는, 그것은 동등이다 : 그것은 코드에 (거의) 동일합니다 물론 LINQ와 다른 곳에서는 위임을 사용할 수 있습니다.

+0

하지만 익명의 방법으로 구독에 관해서는 아무 것도 말하지 않았습니다. OP는 무엇을 묻습니다. – Evk

+0

@Evk : OP는 익명 메소드의 경우 이벤트가 델리게이트로 구독되었다는 것을 이해하는 것으로 보입니다. 익명 메소드는 모두 정확합니다. 거기에는 아무 것도 설명되어 있지 않습니다. 그들은 메소드 그룹에 대한 가입이 어떻게 작동하는지에 대해 혼란스러워 보입니다. 그래서 그것이 제가 설명한 것입니다. –

+0

이 문제를 해결해 주셔서 감사합니다. 나는 배우는 동안 방법 그룹을 만나지 않았지만 지금은 의미가 있습니다. – Konzy262