[C#] 델리게이트 (delegate)

oy Hong·2024년 4월 11일

기술

목록 보기
9/23

델리게이트 (delegate)


C# 에서 델리게이트는 함수를 타입화 한 것이다.


Action, Func, Predicate

자주 사용하게 되는 델리게이트를 템플릿화 한 것

  • Action
    • 함수 파라미터가 T 이고 반환값이 void 인 경우
  • Func<T, TResult>
    • 함수 파라미터가 T 이고 반환값이 TResult 인 경우
  • Predicate
    • 함수 파라미터가 T 이고 반환값이 bool 인 경우

멀티 스레드에서의 문제

멀티 스레드에서의 문제는 다음과 같다.

if(ExampleEvent != null) // 여기서는 문제 없었는데
{
    // 여기서 다른 스레드가 구독을 취소해서 null이 됨!
    ExampleEvent(); // NullReferenceException!
}


이런 복잡한 문제는 검출이 어렵기에 '복사 후 실행' 이란 방법을 통해 예방할 수 있다.

var CopiedEvent = ExampleEvent;

if(CopiedEvent != null)
{
    // 여기서 ExampleEvent 구독 취소 해도 문제 X
    CopiedEvent();
}


좀 더 간결한 표현을 위해 null 조건부 연산자 (?.)를 사용할 수 있다.

ExampleEvent?.Invoke();

null 조건부 연산자 (?.) 의 경우 원자적으로 수행이 되는 연산자라서 이 연산 도중 다른 스레드가 개입할 여지가 없어 멀티 스레드 환경에서도 안전하게 돌아가게 된다.

0개의 댓글