이벤트 호출 시에는 null 조건 연산자를 사용하라

아이템 8 : 이벤트 호출 시에는 null 조건 연산자를 사용하라

Null 조건 연산자의 동작 방식은 연산자의 왼쪽을 평가하여 값이 null 아닌 경우에만 연산자 오른쪽의 표현식을 실행한다. 만약 연산자 왼쪽이 null이면 아무 작업도 수행하지 않고 다음 단락으로 이동한다.

If 문과 비슷해 보이지만 null 연산자는 ? 연산자의 왼쪽을 평가하고 메서드를 수행하는 과정이 원자적으로 수행된다는 점이 다르다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public void RaiseUpdates()
        {
            counter++;
            if(Updated != null)
            {
                Updated(this, counter); //Updated 델리게이트 null 검사 후 실행
                                        //멀티스레드 환경에서는 문제의 소지가 있는 코드
                                        //널 체크를 한 뒤 델리게이트를 실행하기 전에, 다른 스레드에서 델리게이트를 null로 만들 수 있다.
                                        //잘 발생하지는 않지만 재현하기가 굉장히 까다로운 오류
            }
        }

        public void SafeRaiseUpdates()
        {
            counter++;
            var handler = Updated;
            if (handler != null)
            {
                handler(this, counter); //안전하게 명령을 수행하는 코드, 하지만 가독성이 떨어진다
            }
        }

        public void SimpleRaiseUpdates()
        {
            counter++;
            Updated?.Invoke(this, counter); //null 조건 연산자를 활용한 안전하고 간단한 코드
        }

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더