ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 그래픽스
  • 문자열
  • c#
  • 백준
  • 프로그래머스
  • 유니티
  • 티스토리챌린지
  • 클래스
  • 파이썬
  • 오블완
  • 언리얼
  • SQL
  • C
  • 포인터
  • 배열
  • 함수
  • C++
  • Unity
  • 알고리즘
  • string

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/C#

C# ?? 및 ??=, ?. 연산자

2022. 6. 29. 15:26

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() ?? "",
};

출처 : https://velog.io/@jinuku/C-및-.-연산자

저작자표시 (새창열림)

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 배열 복사 방법  (0) 2022.07.01
C# 얕은 복사 깊은 복사  (0) 2022.07.01
C# static (정적) 메서드와 클래스  (0) 2022.06.24
C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값  (0) 2022.06.19
C# 제네릭 (C++ > 템플릿)  (0) 2022.06.13
    '프로그래밍 언어/C#' 카테고리의 다른 글
    • C# 배열 복사 방법
    • C# 얕은 복사 깊은 복사
    • C# static (정적) 메서드와 클래스
    • C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바