이벤트 호출 시에는 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 조건 연산자를 활용한 안전하고 간단한 코드 } |
댓글
댓글 쓰기