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 |
---|