C#에서 DelegateEvent를 사용하는 것은 완전히 가능합니다. 즉, delegate와 event를 정의하고, 해당 이벤트에 메서드를 구독(subscribe)한 후 이벤트를 호출하는 방식은 매우 일반적인 패턴입니다.

간단히 다시 설명하자면, 아래 순서로 작업이 진행됩니다:

  1. Delegate 선언: 특정 시그니처를 가진 메서드를 참조할 수 있는 델리게이트 타입을 정의합니다.
  2. Event 선언: 델리게이트 타입을 사용하여 이벤트를 선언합니다.
  3. Event 구독: 이벤트에 특정 메서드를 구독하여, 이벤트가 발생했을 때 해당 메서드가 호출되도록 합니다.
  4. Event 발생: 이벤트를 호출해서 구독된 메서드를 실행합니다.

코드 분석

1. Delegate 선언

 
public delegate void LogOutEvent(UserInfo userInfo);
  • LogOutEvent는 UserInfo 객체를 인자로 받는 메서드들을 참조할 수 있는 델리게이트 타입입니다.

2. Event 선언

 
public event LogOutEvent LogOutEventNotify;
  • LogOutEventNotify는 LogOutEvent 델리게이트 타입을 기반으로 하는 이벤트입니다.

3. Event 구독

UserService.Instance.LogOutEventNotify += new UserService.LogOutEvent(OnLogOut);
  • OnLogOut이라는 메서드를 LogOutEventNotify 이벤트에 구독합니다. 이 구문은 OnLogOut 메서드가 LogOutEventNotify 이벤트에 등록되어, 이벤트가 발생할 때 호출된다는 의미입니다.

+= 연산자를 사용하여 이벤트에 메서드를 구독하는 방식은 매우 일반적입니다. OnLogOut 메서드는 LogOutEvent 델리게이트가 요구하는 시그니처와 일치해야 합니다.

4. Event 발생

 
LogOutEventNotify(CurrentUser);
  • LogOutEventNotify는 이벤트로, 이를 함수처럼 호출하면 구독된 모든 메서드들이 실행됩니다. 여기서 CurrentUser 객체가 LogOutEvent 델리게이트에 전달됩니다.

주의사항

이 코드는 정상적으로 작동하지만, 이벤트를 호출할 때 몇 가지 주의할 사항이 있습니다.

  1. 이벤트가 null인지 확인: 이벤트에 구독된 메서드가 없으면 LogOutEventNotify는 null일 수 있습니다. 이벤트를 호출하기 전에 null 체크를 해야 합니다.
     
    if (LogOutEventNotify != null) { LogOutEventNotify(CurrentUser); }
     
    혹은 더 간단히 null 조건 연산자를 사용할 수 있습니다:
  2. LogOutEventNotify?.Invoke(CurrentUser);


  3. EventHandler 패턴 사용 (선택 사항): C#에서 이벤트 처리 시, 이벤트 핸들러의 표준 패턴을 따르는 것이 권장됩니다. 표준 이벤트는 일반적으로 object sender, EventArgs e를 매개변수로 받습니다. 하지만 사용자의 요구에 따라 델리게이트를 직접 정의하여 사용할 수도 있습니다.

최종 정리

따라서,   delegate 타입의 event 변수 선언 후 해당 변수에 매개변수를 갖는 delegate 타입의 메서드를 할당한 뒤 이벤트를 호출하는 것은 완전히 가능합니다. 이 패턴은 C#에서 이벤트 처리에 대한 일반적인 방식입니다.

 

 

private void OnLogOut(UserInfo userInfo)
{
    try
    {
       Logic...
    }
}

호출할 메서드는 이건데, 궁금한게 LogOutEvent의 매개변수는 UserInfo 클래스타입인데 OnLogOut 메서드는 void타입이야. 이게 가능해?

 

네, LogOutEvent의 매개변수와 OnLogOut 메서드의 반환 타입에 대한 궁금증은 이해할 수 있습니다. 실제로, 매개변수의 타입과 메서드의 반환 타입은 델리게이트와 메서드의 선언에서 중요한 부분입니다.

여기서 설명드릴 주요 개념은:

  1. 델리게이트의 시그니처: 델리게이트는 특정 메서드 시그니처(즉, 매개변수와 반환 타입)를 정의합니다. LogOutEvent 델리게이트는 다음과 같은 시그니처를 갖습니다:이는 UserInfo 매개변수를 받고, 반환값이 없는 메서드를 참조할 수 있음을 의미합니다.
    public delegate void LogOutEvent(UserInfo userInfo);

     
  2. 이벤트 핸들러: OnLogOut 메서드는 LogOutEvent 델리게이트가 요구하는 시그니처와 일치해야 합니다.OnLogOut 메서드는 UserInfo 타입의 매개변수를 받고, 반환값이 없는 void 타입이므로 LogOutEvent 델리게이트와 완벽히 일치합니다.
private void OnLogOut(UserInfo userInfo) { // 메서드 구현 }

중요한 점

  • 매개변수 타입 일치: OnLogOut 메서드의 매개변수 타입(UserInfo)은 LogOutEvent 델리게이트의 매개변수 타입과 일치해야 합니다. 이는 일치하므로 문제 없습니다.
  • 반환 타입 일치: LogOutEvent 델리게이트는 반환 타입이 void로 설정되어 있습니다. OnLogOut 메서드도 void 반환 타입을 가지고 있기 때문에, 반환 타입도 일치합니다.

따라서, LogOutEvent 델리게이트와 OnLogOut 메서드는 다음과 같이 완벽하게 호환됩니다:

  • 델리게이트와 메서드는 모두 UserInfo 매개변수를 사용합니다.
  • 두 개체 모두 void 반환 타입을 사용합니다.

이러한 일치는 델리게이트와 메서드가 함께 작동할 수 있도록 보장합니다. 이벤트 핸들러로서 OnLogOut 메서드는 LogOutEvent 델리게이트에 의해 호출될 수 있으며, 이벤트가 발생할 때 UserInfo 객체를 처리할 수 있습니다.

 

 

'언어 > C#' 카테고리의 다른 글

ContentControl/ContentTemplate /ContentPresenter/DataTemplate  (0) 2024.10.23
wpf #mvvm with the stateMachine  (0) 2024.10.05
TDD(with msdn)  (0) 2024.09.08
mvvm viewmodel base  (0) 2024.03.01
Console.ReadLine(), 자릿 수 문법  (0) 2023.08.12

+ Recent posts