n Nulnud-coalescing operator
NULL 병합 연산자
?? , ??=
특징 : 오른쪽 결합
null 병합 연산자 라고 부르는 ?? 연산자는
null이 아닌 경우 왼쪽 값을 반환하고 null인 경우 오른쪽 값을 확인 하고 반환하는 연산자다.
만약 왼쪽값이 null 이 아닌경우 오른쪽 값을 확인하지 않는다.
int? a = 17;
int b = 15;
int? c = null;
Console.WriteLine(a ?? b); // Output :17, 왼쪽값이 null이 아니기때문에 17.
Console.WriteLine(c ?? b); //Output :15, 왼쪽(null)->오른쪽 값을 확인해 본뒤 b반환
Console.WriteLine(c ?? c); //Output : , 둘다 null 이기 때문에 null
//Console.WriteLine(b ?? c); Err ?? 연산자는 int 및 int? 형식의 피연산자에 적용할수 없다
int? 가 뭔지 모르겠다면 이 블로그의 Nullable 을 보고오는게 좋다.
https://programing-note.tistory.com/entry/c-Nullabe-%EA%B0%92-%ED%98%95%EC%8B%9D
c#8.0 이상에서 사용할수 있는null 병합 할당 연산자(??=)는 null 병합 연산자 와 비슷하다.
왼쪽 값이 null인경우 우측 값을 할당시켜준다. 물론 좌측값이 null이 아닌경우 우측값을 확인하지 않는다.
int? a = null;
int b = 15;
a ??= b; 좌측값이 null 이기때문에 우측b 값을 확인후 a값에 대입한다.
Console.WriteLine(a); // 15
이 연산자는 가끔 유용하게 쓰일수있다.
예시로는 null인지 확인하는 구문을 간단하게 만들수있다.
if (isNull is null)
{
isNull = 10;
}
이러한 연산을
isNull ??= 10;
이렇게 간단하게 쓸수 있다.
Null 조건부 연산자 ?. 및 ?[]
C# 6이상부터 사용할수 있는 연산자다.
이는 Null이 아닌것으로 평가되었을 때만 멤버 엑세스 ?. ,또는 요소 엑세스?[], 연산을 피연산자 에게 적용하고
Null 인것으로 평가되었을경우 Null을 반환한다.
조건부 멤버나 요소 액세스 작업에서 null 을 반환하면 나머지 체인은 실행되지 않는다.
A?.B?.c
위 와 같을때 A가 Null일때 B는 평가되지 않는다.
이와 같이 A또는 B가 Null일경우 C는 평가되지 않는다.
아래 윈도우 예제 코드를 보면 쉽게 이해할수 있다.
double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
{
return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
}
var sum1 = SumNumbers(null, 0);
Console.WriteLine(sum1); // output: NaN
var numberSets = new List<double[]>
{
new[] { 1.0, 2.0, 3.0 },
null
};
var sum2 = SumNumbers(numberSets, 0);
Console.WriteLine(sum2); // output: 6
var sum3 = SumNumbers(numberSets, 1);
Console.WriteLine(sum3); // output: NaN
//var sum4 = SumNumbers(numberSets, 2); 예외발생
위 코드처럼 코드를 짤때 Null 이 들어가 오류가 생기는 상황을 간단하게 처리할수있다.
주의 할점
a.x 또는 a[x] 가 예외를 던지면 a?.x 또는 a?[x] 는 null이 아닌 예외를 던진다.
위의 예제 마지막줄 처럼 x가 a의 배열의 크기 보다 큰경우 a?[x] 는 IndexOutOFRangeExcption 예외를 던진다.
참고
?. 연산자는 왼쪽 연산자를 한번만 계산하고 null이 아닌것을 확인한 후에는 null로 변경할수 없도록 보장한다.
또한 스레드를 사용할때도 안전하게 호출할수 있다.
스레드를 호출할때 null인지 확인하고 호출하는 것을
var handler = this.PropertyChanged;
if (handler != null)
{
handler(…);
}
를 아래처럼 변경할수있다
PropertyChanged?.Invoke(…)
위 상황처럼 간단하게 사용할수있다
참고 링크 :docs.microsoft.com;
'언어 > C#' 카테고리의 다른 글
c# Nullable값 형식 (0) | 2022.03.24 |
---|---|
c# Tuple (0) | 2022.03.23 |
C# Ref,Out 키워드 와 in 키워드 (0) | 2022.03.16 |