?., ?[] 액세스
C# 백엔드로 직무를 바꾸며 정말 많은 종류의 에러가 null 값에서 멤버 액세스를 할 때 나오는 것을 보았다.
이 때, 회사에서 짜여있는 코드는 모두 if로 null검사를 해서 코드가 정말 길어지는 것을 볼 수 있었다.
단지 null 검사인데 이렇게 길어지는게 보기 싫긴 했지만 다른 방법이 없을거라고 생각하며 썼다.
그런데 C#에 대해 공부하며 또 알아온 것이 있으니
멤버 액세스 연산자 및 식이다.
접근시에 한 객체가 item이라고 하면
item.id 혹은 item["id"]로 접근하는데, 이 때, item이 null이면 에러를 뱉어내며 다음 코드가 작동하지 않는다.
이를 방지하기 위해 if를 쓰며 길어지는데
간단하게 item?.id, item?["id"]로 처리할 수 있다.
이렇게 사용하면 해당 값은 null로 반환되어 에러가 나지 않는다.
?? 및 ??= 연산자
https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/null-coalescing-operator
위와 같이 null 요소에 접근할 때 사용할 수 있다. 혹은 해당 값이 null일 때, 원하는 에러값을 보내주고 있다.
예를 들어 null이 오류이고, 오류는 -9999라는 값으로 표현하기로 했다면
var result = item ?? -9999;
이렇게 표현하는 것이다. 이렇게 되면 더 확실한 오류 메세지를 나타낼 수 있다.
??=의 사용은 아래와 같이 할 수 있다.
item ??= -9999;
??와 ??=의 차이는 item이 null 일 때, null로 놔두냐, 놔두지 않느냐의 차이다.
따라서 ??는 item은 null로 놔두고 result에만 -9999를 보내고,
??= 는 item에 -9999를 넣어주는 것이다. result 값이 필요가 없어지는 것이다.
물론 상황에 따라 사용하는 것이다.
이전에 ??에 대해 다룬 적이 있었는데, 오늘 더 좋은 방법을 찾았기 때문에 다 같이 정리해서 보기 편하도록 정리하였다.
한 글에 정리해놓으면 한번에 비교하면서 어떤 걸 사용할지 정하기 쉽기 때문이다.
이런 방법을 발견하면 현재 코드를 싹 다 바꾸고 싶은 마음이 든다.
하지만 너무 많고, 그에 따른 위험이 너무 크기 때문에 마음으로만 가지고 있는다.
'C#' 카테고리의 다른 글
[C#] string: startsWith, endsWith 시작, 끝 글자 여부 (0) | 2021.07.05 |
---|---|
[C#] JSON 항목 삭제가 불가능 할 때 삭제 하는 방법 (0) | 2021.07.01 |
[C#] char 형식으로 반복문 돌리기 (0) | 2021.05.16 |
[C#] List Sort (0) | 2021.05.13 |
[C#] TimeSpan 24시간 이상 파싱 (0) | 2021.04.15 |
댓글