포스트

[C#] Invoke 이벤트 호출

[C#] Invoke 이벤트 호출

C# 이벤트 호출 방식: ?.Invoke vs null 체크 vs Invoke() 상세 정리


1. 이벤트 호출 기본 형태

C#에서는 이벤트를 호출할 때 다음과 같은 방식들이 존재합니다:

1
2
3
4
5
6
7
8
// 1. 최신 문법 (C# 6.0 이상)
OnSelectedUnitChanged?.Invoke(this, EventArgs.Empty);

// 2. 전통적인 null 체크 방식
if (OnSelectedUnitChanged != null)
{
    OnSelectedUnitChanged(this, EventArgs.Empty);
}

2. ?.Invoke 문법 (Null-conditional operator)

문법

1
OnEvent?.Invoke(...);

설명

  • OnEventnull이 아니면 Invoke() 호출
  • null이면 아무 작업도 하지 않음 (예외도 발생하지 않음)
  • 짧고 간결하며 thread-safe에 더 가까운 방식

장점

  • 코드 간결성
  • NullReferenceException 방지
  • 최신 C#에서 널리 권장되는 방식

3. null 체크 방식

문법

1
2
3
4
if (OnEvent != null)
{
    OnEvent(...);
}

설명

  • C# 초기부터 쓰이던 방식
  • 명시적으로 null을 검사 후 호출
  • 단, 호출 사이에 다른 스레드가 null로 바꾸면 예외 발생 가능

4. Thread-safe 방식 (임시 변수 사용)

문법

1
2
3
4
5
var handler = OnEvent;
if (handler != null)
{
    handler(...);
}

설명

  • delegate를 임시 변수에 복사한 후 null 체크
  • 멀티스레드 환경에서 가장 안전한 방식
  • 복사 시점 이후에는 외부 영향 없이 안전하게 호출 가능

5. Invoke() 메서드란?

정의

  • Invoke()는 이벤트(델리게이트)를 실행(호출) 하는 메서드입니다.
  • 사실상 eventName.Invoke(...)eventName(...)과 같은 의미입니다.

예시

1
2
3
4
5
public event EventHandler OnHit;

void Hit() {
    OnHit?.Invoke(this, EventArgs.Empty); // OnHit(this, EventArgs.Empty); 와 동일
}

특징

  • Invoke()가독성 측면에서 명확하게 “호출” 의도를 전달
  • delegate 또는 event가 null이 아닌 경우만 호출 가능

6. 호출 방식 비교 요약

방식코드 예특징멀티스레드 안전성
?.InvokeOnEvt?.Invoke(...)가장 간결, 최신 문법상대적으로 안전
null 체크if (OnEvt != null) OnEvt(...)전통적 방식안전하지 않음
임시 변수var h = OnEvt; if (h != null) h(...)멀티스레드 안정성 확보안전
Invoke 생략OnEvt(...)간단하지만 예외 가능안전하지 않음

7. 요약

  • ?.Invoke()현대 C#에서 기본 권장 방식
  • 멀티스레드 환경에서는 임시 변수 복사 후 호출이 안전
  • Invoke()는 호출 의도를 명확히 표현하는 메서드이며, 사용 여부는 선택적
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.