본문 바로가기
Programming/C#

(C#) if문에서의 null 체크와 null 연산자의 차이

by MeisterTJ 2022. 8. 6.
public class EventSource
{
    private EventHandler<int> Updated;
    
    public void RaiseUpdates()
    {
        ...
    }

    private int counter;
}

위와 같은 클래스가 있고, RaiseUpdates시 counter를 증가시키고, Updated 이벤트를 호출한다고 생각해보자.

 

public void RaiseUpdates()
{
    counter++;
    if(Updated != null)
    {
        Updated(this, counter);
    }
}

그냥 Updated를 호출하면 null이면 Exception이 발생하기 때문에, null 체크를 해주는게 안전하다.

 

1. if 문으로 Updated의 null을 검사하거나

2. null 연산자를 이용하거나 

 

두 가지의 방법 중 하나를 쓰면 되는데, 두 동작에는 차이가 있다.

 

1의 경우 null 체크와 실제 call 사이에 Thread 간의 Switching이 일어날 가능성이 있다. (실제로는 희박하겠지만!)

그렇기 때문에 Updated != null 이더라도 그 다음 구문이 실행되기 전에 다른 Thread에서 Updated를 null로 만들 수 있는 것이다.

public void RaiseUpdates()
{
    counter++;
    Updated?.Invoke(this, counter);
}

2의 경우 Thread간의 Switching으로 인해 문제가 생길 가능성은 없다.

null 연산자 ? 의 경우 연산자 앞이 null 일 경우 뒤의 문장을 실행시키지 않는 특징과 동시에

atomic 하다는 특징을 지니고 있다.

 

그렇기 때문에 저 문장 사이에서는 Switching이 일어나지 않고, 한번에 수행이 된다.

 

 

참고 : Effective C# (3판)

'Programming > C#' 카테고리의 다른 글

(C#) Generic Method 에서 null return 하는 방법  (0) 2022.07.24