[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(...);
설명
OnEvent가null이 아니면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. 호출 방식 비교 요약
| 방식 | 코드 예 | 특징 | 멀티스레드 안전성 |
|---|---|---|---|
| ?.Invoke | OnEvt?.Invoke(...) | 가장 간결, 최신 문법 | 상대적으로 안전 |
| null 체크 | if (OnEvt != null) OnEvt(...) | 전통적 방식 | 안전하지 않음 |
| 임시 변수 | var h = OnEvt; if (h != null) h(...) | 멀티스레드 안정성 확보 | 안전 |
| Invoke 생략 | OnEvt(...) | 간단하지만 예외 가능 | 안전하지 않음 |
7. 요약
?.Invoke()는 현대 C#에서 기본 권장 방식- 멀티스레드 환경에서는 임시 변수 복사 후 호출이 안전
Invoke()는 호출 의도를 명확히 표현하는 메서드이며, 사용 여부는 선택적
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.