C# 코드를 작성하다보면 null
체크를 해야하는 경우가 꽤 많다. if
문을 사용해서 null
체크를 하다보면 코드가 길어지고 가독성이 떨어지게된다.
그래서 C# 에서는 간단한 연산자로 null
체크를 할 수 있는 방법을 제공한다! 잘 사용하면 코드 가독성도 높이고 에러 발생도 미리 예방할 수 있다.
?.
및 ?[]
피연산자가 null
이 아닌 것으로 평가되었을 때만 멤버 액세스 ?.
또는 요소 액세스 ?[]
연산을 피연산자에게 적용하며, 그렇지 않으면 null 을 반환한다.
a
가 null
로 평가되면 a?.x
또는 a?[x]
의 결과는 null
이다.a
가 null
이 아닌 것으로 평가되면 a?.x
또는 a?[x]
의 결과는 각각 a.x
또는 a[x]
의 결과와 같다.Null 조건부 연산자는 단락 연산자이다. 즉 조건부 멤버나 요소 액세스 작업의 한 체인의 작업에서 null
을 반환하면 나머지 체인은 실행되지 않는다. 다음 예제에서 A가 null
로 평가되면 B가 평가되지 않고, A또는 B가 null
로 평가되면 C가 평가되지 않는다.
A?.B?.Do(C);
A?.B?[C];
??
및 ??=
null 병합 연산자 ??
는 null
이 아닌 경우 왼쪽 피연산자의 값을 반환한다. 그렇지 않으면 오른쪽 피연산자를 평가하고 그 결과를 반환한다. 왼쪽 피연산자가 null
이 아닌 것으로 평가되면 ??
연산자는 오른쪽 피연산자를 평가하지 않는다.
C# 8.0 이상에서 사용할 수 있는 null 병합 할당 연산자 ??=
는 왼쪽 피연산자가 null
로 계산되는 경우에만 오른쪽 피연산자의 값을 왼쪽 피연산자에 대입한다. 왼쪽 피연산자가 null
이 아닌 것으로 평가되면 ??=
연산자는 오른쪽 피연산자를 평가하지 않는다.
List<int> numbers = null;
int? a = null;
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers)); // output: 5
numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
Console.WriteLine(a); // output: 0
??=
연산자의 왼쪽 피연산자는 변수, 속성 또는 인덱서 요소여야 합니다.
C# 7.3 이전 버전에서??
연산자의 왼쪽 피연산자 형식은 참조 형식 또는 Nullable 값 형식이어야 합니다.
C# 8.0부터 이 요구 사항이 다음과 같이 바뀝니다.??
및??=
연산자의 왼쪽 피연산자 형식은 null을 허용하지 않는 값 형식일 수 없습니다. 특히 C# 8.0부터 비제한 형식 매개 변수와 함께 null 병합 연산자를 사용할 수 있습니다.
유저 데이터를 받아오는 코드에서 사용 예제
var userData = userDB.ToDictionary();
UserManager.Instance.CurrentUser = new User {
uid = userData["uid"]?.ToString() ?? "",
email = userData["email"]?.ToString() ?? "",
name = userData["name"]?.ToString() ?? "UnNamed",
licenseId = userData["licenseId"]?.ToString() ?? "",
};